python - 在 C/openCL 中寻址 vector 元素

标签 python c++ c vector opencl

我正在 pyopenCL 中编写一个 openCL 内核,我想在其中处理 vector 元素。

在纯 C 中,我想要的结果是:

int i = 0;
float *vec = (float*)maalloc(sizeof(float)*4);
for (i=0;i<4;i++)
{
    vec[i]=2*i;
}

在 openCL 中, vector 的元素以“pythonic”点语法风格访问。

float4 vec = (float4)(0);
for (i=0;i<4,i++)
{
    vec.si = 2*i;
/*obviously doesn't work*/
}

所以 vec[2] 在 openCL 中变成了 vec.s2 ,所以用变量访问元素不再是直截了当的。尽管如此,如何使用变量访问 vector 元素?

最佳答案

OpenCL 支持主机端组件和设备端组件(内核)的 C,因此您可以使用 float 数组编写与第一个示例几乎完全相同的内核。内核可能如下所示:

__kernel void vectorAddition(__global float* vec) {
  // Get the global thread id in x dimension(eliminates loop)
  size_t index = get_global_id(0);

  vec[index] = 2.0f * index;
}

然后您可以指定要使用的线程数,以便对数组的每个元素执行此操作(使线程数与数组中的元素数相同)。

OpenCL 确实允许使用点符号进行访问,但这是为了访问 vector data types 的元素。 . vector 数据类型可以提供改进的性能,因为可以同时对 vector 数据类型中的所有元素执行相同的操作。

例如,float4 是一种 vector 数据类型,它存储四个彼此相邻的 32 位 float 以构成一个 128 位结构。然后,您可以一次对所有 4 个 float 执行操作。

例如:

float4 v = (float4)(1.0f, 2.0f, 3.0f, 4.0f);
float4 mult_result = v * 2;

这需要一条指令同时进行四个乘法。 mult_result 的值为 {2.0f, 4.0f, 6.0f, 8.0f}

然后可以使用点符号来访问 float4 变量的组件,例如:

float a = v.x;           // a = 1.0f
float b = mult_result.y; // b = 4.0f

这里是 vector 数据类型的总结:Vector Data Type Overview .

关于python - 在 C/openCL 中寻址 vector 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34948890/

相关文章:

c++ - std::unique_lock::_Owns 数据成员不是原子的?

c - Project Euler #97 模幂运算不工作

python - 如何用python3.6安装theano?

python - 如何使用角度轴旋转 3d 点集到旋转矩阵?

python - Docker类(class)教程,python pip失败

c - 头文件 (.h)、库文件 (.lib) 和 DLL (.dll) 文件如何关联

c - union 或 struct 允许从未初始化的实例赋值吗?

python - Graph matplotlib 以显示直方图箱中的总计数

java - 编程语言中的 for 循环 VS while 循环,c++/java?

c++ - 如何输入 int64_t/uint64_t 常量?