Vector 在OpenCL内核中有什么特殊的操作向量吗?

Vector 在OpenCL内核中有什么特殊的操作向量吗?,vector,opencl,Vector,Opencl,我必须优化我的OpenCL程序。所以我想我必须使用我的GPU(一个小型的4核处理器)提供的向量运算来完成它 我看到它可以处理的char/short/int/float类型的首选向量宽度是4 我想我只需要打电话: __kernel void mykernel(__global char4 *a, __global char4 *b) 使用向量操作,但是如果不是4的倍数,OpenCL如何处理“a” 谢谢 巴普蒂斯特如果a不是4的倍数,你是什么意思 在您

我必须优化我的OpenCL程序。所以我想我必须使用我的GPU(一个小型的4核处理器)提供的向量运算来完成它

我看到它可以处理的char/short/int/float类型的首选向量宽度是4

我想我只需要打电话:

__kernel void mykernel(__global char4 *a,
                       __global char4 *b)
使用向量操作,但是如果不是4的倍数,OpenCL如何处理“a”

谢谢


巴普蒂斯特

如果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;
}
__kernel foo(__global char4 * a, __global char4 * b){
     b = -a;
}
主办方:

... 
clCreateBuffer(context, CL_MEM_READ_WRITE, size * cl_char, NULL, NULL);
...
... 
clEnqueueNDRangeKernel(queue, kernel, 1, NULL, size, NULL, NULL, NULL, NULL);
...
... 
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);
...
向量

内核:

__kernel foo(__global char * a, __global char * b){
     b = a;
}
__kernel foo(__global char4 * a, __global char4 * b){
     b = -a;
}
主办方:

... 
clCreateBuffer(context, CL_MEM_READ_WRITE, size * cl_char, NULL, NULL);
...
... 
clEnqueueNDRangeKernel(queue, kernel, 1, NULL, size, NULL, NULL, NULL, NULL);
...
... 
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);
...

是的。这就是我说的那个问题的意思。如果我的主机中有char a[1001],并且我通过内核中的缓冲区将其传递给我的设备,类型为char4,我猜我将有251个元素,最后一个包含3个不使用的元素。但是它是由GPU自动完成的吗?OpenCL是否选择了正确的全局工作空间?如果您有1001个元素的字符,您应该手动将此内存映射到char4[251]数组,并将其传递给GPU。然后启动一个251全局大小的内核。如果您的操作是char级别的元素操作,那么只需处理并丢弃内核生成的最后3个结果。如果不是,那么您需要对最后一组元素进行传统逻辑或处理。好的!我是这么想的,但我想确认一下,因为我不确定。谢谢