我正在学习使用opencl。现在我的任务很简单,将一个大型数组复制到另一个大型数组。假设[301] [300] [300]到b [301] [300] [300]。这只是一个让我了解全球工作规模和当地工作规模的测试。我使用SVM将float8矢量数组传递给内核。
__global float8* dts,
__global float8* dts_from_file
1。我似乎必须选择全球工作规模>数组大小,在我的测试用例中
size_t globalWorkSize[3] = { 128, 128, 256 };
(128 * 128 * 256 * 8)> 301 * 300 * 300。否则,我得到截断输出。我是对的,还是只是对全球工作规模的定义感到困惑?仅供参考,
CL_DEVICE_ADDRESS_BITS=64
CL_DEVICE_MAX_WORK_GROUP_SIZE=256
CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS=3
CL_DEVICE_MAX_WORK_ITEM_SIZES[0,1,2]=256, 256, 256
2。 CL_KERNEL_WORK_GROUP_SIZE = 256限制了本地工作规模吗?
size_t localWorkSize[3] = { 4,8,8 };
只要我将4更改为更大的值,就会出现clEnqueueNDRangeKernel错误CL_INVALID_WORK_GROUP_SIZE,因为4 * 8 * 8 = 256?
3. 如果多个设备(CPU + GPU)的全局/本地工作大小怎么样,我是否需要为每个设备指定不同的工作大小?
提前致谢。
答案 0 :(得分:0)
总的本地工作量不能超过CL_DEVICE_MAX_WORK_GROUP_SIZE,并且每个都不能超过CL_DEVICE_MAX_WORK_ITEM_SIZES。在您的情况下使用本地工作大小{4,8,8}是可以的 全球工作规模中的每一个都必须是当地工作规模的倍数。当您的内核只处理一个数据时,您必须将全局工作大小设置为大于数组大小,并在内核中添加一个检查,如下所示
if (get_global_id(0) < array_size_x) { ... }
如果每个项目都可以处理更多数据,则必须在不同情况下进行不同的检查。
每个设备都有不同的工作尺寸,必须单独设置。使不同的设备同时运行相同的内核并非易事。