2016-01-22 83 views
0

我在pyopenCL中编写了一个openCL内核,我想在其中寻址向量元素。C/openCL中的向量元素

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

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

在OpenCL中,向量的元素在一个“Python的”点的语法式被存取。

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

vec[2]所以成为在OpenCL中vec.s2,所以它不再直接的具有可变访问的元素。然而,如何使用变量访问vector元素呢?

+0

如果您想使用数组操作来访问它,请使用数组。用[]访问矢量是不可能的。因为元素访问需要在编译时为矢量知道。 – M4rtini

+0

http://stackoverflow.com/questions/9788806/access-vector-type-opencl看到这个一些hacky解决方案 – M4rtini

+0

你可以使用'vec.s [i]'。但是,为什么要使用矢量然后再分割它们?这破坏了矢量的目的。只需要执行'vec = vec *(float4)(0,2,4,6);' – DarkZeros

回答

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