如果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);
...