OpenCL全球/本地工作规模选择

时间:2016-12-21 22:12:55

标签: c++ windows visual-studio opencl

我正在学习使用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)的全局/本地工作大小怎么样,我是否需要为每个设备指定不同的工作大小?

提前致谢。

1 个答案:

答案 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)    {   ...   }

如果每个项目都可以处理更多数据,则必须在不同情况下进行不同的检查。

每个设备都有不同的工作尺寸,必须单独设置。使不同的设备同时运行相同的内核并非易事。