我正在编写代码来添加两个维度为 1024*1024 的矩阵。 所以我的工作维度必须是 2,全局工作大小应该是 1024*1024。我想设置每个工作组的大小为64*64。我该如何实现?
所以我的代码应该是这样的:-
clEnqueueNDRangeKernel(cl_command_queue command_queue,cl_kernel kernel,cl_uint work_dim,const size_t *global_work_offset,
const size_t *global_work_size,const size_t *local_work_size,
cl_uint num_events_in_wait_list,const cl_event *event_wait_list,cl_event *event)
其中 local_work_size=64*64
,global_work_size=1024*1024
,work_dim=2
。
如何获取内核代码中的各个元素?
这是我的内核代码:-
__kernel void hello(__global int ** A,__global int ** B,__global int ** C)
{
int x = get_global_id(0);
int y = get_global_id(1);
C[x][y]=A[x][y]+B[x][y];
}
最佳答案
您的内核启动看起来像这样:
size_t global[2] = {1024, 1024};
size_t local[2] = {64, 64};
clEnqueueNDRangeKernel(queue, kernel, 2, NULL, global, local, 0, NULL, NULL);
你的内核会像这样检索它的索引:
kernel void foo(...)
{
int x = get_global_id(0);
int y = get_global_id(1);
...
}
顺便说一句,我遇到的大多数 OpenCL 设备的最大工作组大小为 1024,这意味着它们不支持 64x64 的工作组大小。
由于您只能在 OpenCL 中使用一维缓冲区,因此您需要手动计算线性阵列索引。以下是您的简单矩阵加法内核的外观:
__kernel void hello(__global int *A,__global int *B,__global int *C, int width)
{
int x = get_global_id(0);
int y = get_global_id(1);
int index = x + y*width;
C[index] = A[index] + B[index];
}
关于工作维度 = 2 的 clEnqueueNDRangeKernel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31378841/