在矩阵运算上获得 CL_INVALID_WORKGROUP_SIZE
Getting CL_INVALID_WORKGROUP_SIZE on matrix operations
我传入一个矩阵作为全局内存并处理本地内存中的每个向量(行)。传入的实际矩阵是 100 X 2025,但在内核中我用零填充它以利用 2 的幂运算。我在每个工作项中处理向量的 4 个元素。
MAX_WORK_ITEM_SIZES: (512,512,512)
MAX_WORK_GROUP_SIZE: 512
size_t globalWorkSize[2] = { 100, 2048 };
size_t localWorkSize[1] = { 512 };
我也试过使 localWorkSize 二维:{1, 512} 但我得到同样的错误,CL_INVALID_WORKGROUP_SIZE 在这个函数调用中:
err = clEnqueueNDRangeKernel( openCLObjects.queue, openCLObjects.Normalize, 2, NULL,
globalWorkSize, localWorkSize, 0, NULL, NULL );
知道可能出了什么问题吗?
谢谢。
设备属性:(设备的通用上限)
- MAX_WORK_ITEM_SIZES: 工作组中每个维度的最大工作项数。
- MAX_WORK_GROUP_SIZE:一个工作组中的最大工作项总数(所有维度大小的乘积)。
内核属性:(特定设备内核编译限制)
- CL_KERNEL_WORK_GROUP_SIZE:最大工作组项目总数(所有维度大小的乘积)
第一个是针对每个设备进行硬编码的,可能受到在完整 SIMD 模式下可以处理的项目数量的限制。
第二个限制是针对每个内核的,您应该改用它。这一个考虑了更多特定于您的代码的事情。比如最大私有内存等...
你也满足第二个要求吗?
顺便说一句:在任何情况下你都应该使用:
size_t globalWorkSize[2] = { 100, 2048 };
size_t localWorkSize[2] = { 1, 512 };
我传入一个矩阵作为全局内存并处理本地内存中的每个向量(行)。传入的实际矩阵是 100 X 2025,但在内核中我用零填充它以利用 2 的幂运算。我在每个工作项中处理向量的 4 个元素。
MAX_WORK_ITEM_SIZES: (512,512,512) MAX_WORK_GROUP_SIZE: 512
size_t globalWorkSize[2] = { 100, 2048 };
size_t localWorkSize[1] = { 512 };
我也试过使 localWorkSize 二维:{1, 512} 但我得到同样的错误,CL_INVALID_WORKGROUP_SIZE 在这个函数调用中:
err = clEnqueueNDRangeKernel( openCLObjects.queue, openCLObjects.Normalize, 2, NULL,
globalWorkSize, localWorkSize, 0, NULL, NULL );
知道可能出了什么问题吗?
谢谢。
设备属性:(设备的通用上限)
- MAX_WORK_ITEM_SIZES: 工作组中每个维度的最大工作项数。
- MAX_WORK_GROUP_SIZE:一个工作组中的最大工作项总数(所有维度大小的乘积)。
内核属性:(特定设备内核编译限制)
- CL_KERNEL_WORK_GROUP_SIZE:最大工作组项目总数(所有维度大小的乘积)
第一个是针对每个设备进行硬编码的,可能受到在完整 SIMD 模式下可以处理的项目数量的限制。
第二个限制是针对每个内核的,您应该改用它。这一个考虑了更多特定于您的代码的事情。比如最大私有内存等...
你也满足第二个要求吗?
顺便说一句:在任何情况下你都应该使用:
size_t globalWorkSize[2] = { 100, 2048 };
size_t localWorkSize[2] = { 1, 512 };