在C / openCL中使用矢量元素

时间:2016-01-22 14:20:42

标签: python c++ c vector opencl

我在pyopenCL中编写了一个openCL内核,我想在其中处理向量元素。

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

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

在openCL中,向量的元素在&#34; pythonic&#34;中被访问。点语法风格。

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

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

1 个答案:

答案 0 :(得分:1)

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的元素。矢量数据类型可以提供改进的性能,因为可以同时对矢量数据类型中的所有元素进行相同的操作。

例如,float4是一种向量数据类型,它将两个32位浮点数相互存储,形成一个128位结构。然后,您可以一次对所有4个浮点数执行操作。

例如:

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 Data Type Overview