C++ OpenCL全球/本地工作规模选择
我正在学习使用opencl。现在我的任务很简单,将一个大数组复制到另一个数组。假设a[301][300][300]到b[301][300][300]。这只是一个测试,让我了解什么是全球工作规模和本地工作规模。我使用SVM将float8向量数组传递给内核C++ OpenCL全球/本地工作规模选择,c++,windows,visual-studio,opencl,C++,Windows,Visual Studio,Opencl,我正在学习使用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,
__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\u内核\u工作组\u大小=256的限制
size_t localWorkSize[3] = { 4,8,8 };
只要我将4更改为更大的值,就会出现ClenqueEndRangeKernel错误CL_无效的工作组大小,因为4*8*8=256
3.多个设备(CPU+GPU)的全局/本地工作大小如何,是否需要为每个设备指定不同的工作大小
提前感谢。总的本地工作大小不能超过CL\U设备\u最大工作\u组\u大小,并且每个本地工作大小都不能超过CL\U设备\u最大工作\u项目\u大小。在您的情况下,使用本地工作大小{4,8,8}是可以的。
全局工作大小中的每一个都必须是本地工作大小的倍数。当内核只处理一段数据时,必须将全局工作大小设置为大于数组大小,并在内核中添加如下检查
if (get_global_id(0) < array_size_x) { ... }
if(get_global_id(0)
当然,由于每个项目可以处理更多的数据,您必须在不同的情况下进行不同的检查
每个设备有不同的工作尺寸,必须单独设置。让不同的设备同时运行同一个内核不是一件容易的事情。总的本地工作大小不能超过CL_设备最大工作组大小,并且每个设备都不能超过CL_设备最大工作项大小。在您的情况下,使用本地工作大小{4,8,8}是可以的。
全局工作大小中的每一个都必须是本地工作大小的倍数。当内核只处理一段数据时,必须将全局工作大小设置为大于数组大小,并在内核中添加如下检查
if (get_global_id(0) < array_size_x) { ... }
if(get_global_id(0)
当然,由于每个项目可以处理更多的数据,您必须在不同的情况下进行不同的检查
每个设备有不同的工作尺寸,必须单独设置。让不同的设备同时运行同一个内核不是一件容易的事情。什么样的设备将CL\U设备\U最大工作\U项目大小限制为256 x 256 x 256?我见过的大多数设备至少有8192 x 8192 x(大约)或更大。什么样的设备将CL_设备_MAX_WORK_ITEM_大小限制为256 x 256 x 256?我见过的大多数至少有8192 x 8192 x(大约)或更大。