Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenCL全球/本地工作规模选择_C++_Windows_Visual Studio_Opencl - Fatal编程技术网

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

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,

我正在学习使用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\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(大约)或更大。