【发布时间】:2016-12-22 17:30:32
【问题描述】:
我正在学习使用 opencl。现在我的任务很简单,将一个大数组复制到另一个。假设 a[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)的全局/本地工作量如何,是否需要为每台设备指定不同的工作量?
提前致谢。
【问题讨论】:
-
哪种设备将 CL_DEVICE_MAX_WORK_ITEM_SIZES 限制为仅 256 x 256 x 256?我见过的大多数都至少有 8192 x 8192 x(某物)或更大。
标签: c++ windows visual-studio opencl