我正在学习使用opencl。现在我的任务很简单,把一个大数组复制到另一个数组。让我们假设a301300对b301300。这只是一个测试,让我了解什么是全球工作规模和本地工作规模。并利用支持向量机将float8向量阵传递给核函数。
__global float8* dts,
__global float8* dts_from_file
1.在我的测试用例中,我似乎必须选择全局工作大小>数组大小。
size_t globalWorkSize[3] = { 128, 128, 256 };
(128*128*256*8)>301*300*300。否则,我将得到截断输出。我是对的,还是只是对全球工作规模的定义感到困惑?FYI
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)如何,是否需要为每个设备指定不同的工作大小?
提前谢谢。
发布于 2016-12-22 09:30:32
本地工作的总大小不能超过CL_DEVICE_MAX_WORK_GROUP_SIZE,而且每一个都不能超过CL_DEVICE_MAX_WORK_ITEM_SIZES。在您的情况下,使用本地工作大小{4、8、8}是可以的。
全局工作大小中的每一个都必须是本地工作大小的倍数。当内核只处理一段数据时,必须设置大于数组大小的全局工作大小,并在内核中添加如下检查
if (get_global_id(0) < array_size_x) { ... }
每个项目都可以处理更多的数据,您必须在不同的情况下进行不同的检查。
每个设备都有不同的工作大小,它们必须独立设置。让不同的设备同时运行同一内核并不是一件容易的事情。
https://stackoverflow.com/questions/41272795
复制相似问题