将 OpenCL 函数更改为C++
Change OpenCL function to C++
我正在尝试用C++编写代码,但是在互联网上进行了一些搜索后,我发现一个基于OpenCL的代码正在做与我想在C++中做的事情完全相同。但由于这是我第一次看到 OpenCL 代码,我不知道如何将以下函数更改为 c++:
const __global float4 *in_buf;
int x = get_global_id(0);
int y = get_global_id(1);
float result = y * get_global_size(0);
在 C++ 中,"const __global float4 *in_buf
"等同于"const float *in_buf
"吗?以及如何更改上述其他功能?谁能帮忙?谢谢。
一般来说,你应该看看OpenCL规范(我假设它是用OpenCL 1.x编写的),以更好地理解函数、类型和内核的工作原理。
专门针对您的问题:
get_global_id
返回当前工作项的 ID,get_global_size
返回工作项的总数。由于 OpenCL 工作项大致相当于顺序语言中的单个迭代,因此相当于 OpenCL
int x = get_global_id(0);
int y = get_global_id(1);
// do something with x and y
float result = y * get_global_size(0);
将是 C 的:
for (int x = 0; x < dim0; x++) {
for (int y = 0; y < dim1; y++) {
// do something with x and y
float result = y * dim0;
}
}
至于float4
它是 4 个浮点数的向量类型,大致相当于 C 的float[4]
(除了它支持许多其他运算符,例如向量算术)。当然,在这种情况下它是一个缓冲区,因此适当的类型将是float**
或float[4]*
- 或者更好的是,只需将它们打包到float*
缓冲区中,然后一次加载 4 个。
随意忽略__global
修饰符。
const __global float4 *in_buf
不等同于const float *in_buf
。OpenCL使用向量变量,例如 floatN
,其中 N 是例如 2,4,8。因此,float4
实际上struct { float w, float x, float y, float z}
有很多技巧可用于表达向量运算。
get_global_id(0) 为您提供迭代器变量,因此基本上将每个get_global_id(dim)
替换为for(int x = 0; x< max[dim]; x++)
- 使用std::vector的OpenCL矩阵乘法
- OpenCL 内核参数中的字符***?
- 在 NVIDIA GEFORCE GTX 1050 上下载适用于 Windows 10 的 openCL 1.2
- OpenCL 是否支持向量作为内核参数?
- 向量加法代码 OpenCL 返回 clCreateKernel 错误 -46
- 提高 OpenCL 的性能
- openCL 内核返回垃圾值,尽管没有错误
- OpenCL 内核计时测量 0 秒或导致 SIGABRT
- 0xc000007b Windows 上的 OpenCL 库的加载时间错误
- OpenCL 在 NVIDIA 和 Intel GPU 上启动内核时CL_INVALID_COMMAND_QUEUE
- OpenCL 代码卡在写入输出缓冲区上
- 将 C++ 库包含在 OpenCL 内核中?
- 如何在 OpenCL 中将小写转换为大写,反之亦然
- OpenCL 错误类在主机C++给出错误
- Zedboard zynq-7000 Opencl 浮点数从类型 'double*' 强制转换为类型 'double' 无效
- OPENCL 警告:不兼容的指针类型将'float __global[16]'传递给类型为 '__global float4 的参数 *
- 使用 NVIDIA GPU 在 Cygwin 中链接 OpenCL 库时遇到问题
- 在 OpenCL 库中找不到 cl::Error 类
- 在 OpenCL 内核中实现半精度浮点数据类型
- 在 Radeon 卡上并行执行多个 OpenCL 内核