在OpenCL内核中对vector进行操作有什么特别之处吗?

时间:2013-10-21 13:02:32

标签: vector opencl

我必须优化我的OpenCL程序。所以我认为我将不得不使用我的GPU(一个小的4核一个)提供的向量操作来完成它。

我看到它的首选矢量宽度为4,对于char / short / int / floatn它可以处理的类型。

我想我只需要打电话:

__kernel void mykernel(__global char4 *a,
                       __global char4 *b)

使用向量操作但是如果OpenCL不是4的倍数,OpenCL如何处理'a'?

谢谢

巴普蒂斯特

1 个答案:

答案 0 :(得分:0)

如果a不是4的倍数,你是什么意思?

如果您公开ab是char4类型。这些类型中的每一个都是包含4个char元素的结构。允许a[0].x a[0].y a[0].z a[0].w等操作。 但是你永远不会在你的内核中有一个半结构,也就是一个非完整的结构。

考虑到你的问题,我怀疑你试图说,“如果我的主机传递了4个字符数组的非多个字符怎么办”。问题不在于您在主机端使用的类型。因为你永远不应该在主机端使用与内核中的类型不匹配的类型。

(您使用的是cl_char吗?) 改为使用cl_char4。

编辑:为了澄清我会举一个例子:

没有载体

内核:

__kernel foo(__global char * a, __global char * b){
     b = a;
}

主持人:

... 
clCreateBuffer(context, CL_MEM_READ_WRITE, size * cl_char, NULL, NULL);
...
... 
clEnqueueNDRangeKernel(queue, kernel, 1, NULL, size, NULL, NULL, NULL, NULL);
...

<强>载体

内核:

__kernel foo(__global char4 * a, __global char4 * b){
     b = -a;
}

主持人:

... 
clCreateBuffer(context, CL_MEM_READ_WRITE, (size/4+1) * cl_char4, NULL, NULL);
...
... 
clEnqueueNDRangeKernel(queue, kernel, 1, NULL, (size/4+1), NULL, NULL, NULL, NULL);
...