我必须优化我的OpenCL程序。所以我认为我将不得不使用我的GPU(一个小的4核一个)提供的向量操作来完成它。
我看到它的首选矢量宽度为4,对于char / short / int / floatn它可以处理的类型。
我想我只需要打电话:
__kernel void mykernel(__global char4 *a,
__global char4 *b)
使用向量操作但是如果OpenCL不是4的倍数,OpenCL如何处理'a'?
谢谢
巴普蒂斯特答案 0 :(得分:0)
如果a不是4的倍数,你是什么意思?
如果您公开a
,b
是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);
...