工作维度 = 2 的 clEnqueueNDRangeKernel

标签 c linux parallel-processing opencl gpgpu

我正在编写代码来添加两个维度为 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*64global_work_size=1024*1024work_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/

相关文章:

c - C 字符串中 '\0' 之后的内存会发生什么?

c - 排序函数中的数组和类型/值错误

c - 需要 MPI 通信器创建数据包的逻辑是什么?

linux - 颠覆svn+ssh,sshd 100% CPU

regex - 将 CPU 温度存储在变量中

linux - 为什么即使使用 nohup 也能捕获挂断信号?

Python 多处理进程静默崩溃

c - 为什么我的 char 指针不存储值?

r - 在 R 中重现并行SVM结果的问题

go - 保存并行化 goroutine 的结果