如何正确选择work_group_size?
How to correctly choose work_group_size?
我正在尝试使用 OpenCl 进行矩阵乘法。
A 是 1000x1000,B 是 1000x1000,所以我的 C=AxB 也是 1000x1000。
例如,我的 local_size 是 14.
size_t local_item_size[2] = { local_size, local_size };
我读到工作组的规模就是我的问题的规模。 C 有 2 个维度,所以我会尝试设置
size_t work_group_size[2] =
{ N, N };
err = clEnqueueNDRangeKernel(dev.queue, kernel, 2, 0,
global_item_size, work_group_size,
0, NULL, &event);
但是我得到了 CL_INVALID_WORK_GROUP_SIZE
。我怎样才能正确选择 global_item_size 我的电脑的最大工作组大小是 1024。这是否意味着我不能使用更大的矩阵?
非常感谢
局部大小必须是全局大小的整除数。
1000x1000 可以被 10x10 或 20x5 整除,类似的
如果您坚持局部大小为 14,则应填充整个数组以使其具有 1400x1400 之类的大小,这样它就可以工作,但不完全是在填充的补丁上。这浪费了周期,但至少兼容任何尺寸,直到(包括)1400x1400。
如果您的设备的最大本地大小为 1024,则它可以处理 32x32 的本地大小。或 1-D 中的 1024。
我正在尝试使用 OpenCl 进行矩阵乘法。 A 是 1000x1000,B 是 1000x1000,所以我的 C=AxB 也是 1000x1000。 例如,我的 local_size 是 14.
size_t local_item_size[2] = { local_size, local_size };
我读到工作组的规模就是我的问题的规模。 C 有 2 个维度,所以我会尝试设置
size_t work_group_size[2] =
{ N, N };
err = clEnqueueNDRangeKernel(dev.queue, kernel, 2, 0,
global_item_size, work_group_size,
0, NULL, &event);
但是我得到了 CL_INVALID_WORK_GROUP_SIZE
。我怎样才能正确选择 global_item_size 我的电脑的最大工作组大小是 1024。这是否意味着我不能使用更大的矩阵?
非常感谢
局部大小必须是全局大小的整除数。
1000x1000 可以被 10x10 或 20x5 整除,类似的
如果您坚持局部大小为 14,则应填充整个数组以使其具有 1400x1400 之类的大小,这样它就可以工作,但不完全是在填充的补丁上。这浪费了周期,但至少兼容任何尺寸,直到(包括)1400x1400。
如果您的设备的最大本地大小为 1024,则它可以处理 32x32 的本地大小。或 1-D 中的 1024。