c++ - 并非所有工作项目都在使用 opencl

标签 c++ linux opencl gpgpu nvidia

所以我能够编译和执行我的内核,问题是只使用了两个工作项。我基本上是在尝试用 {0,1,2,3,4,5,6,7} 填充 float 组 [8]。所以这是一个非常简单的 hello world 应用程序。下面是我的内核。

// Highly simplified to demonstrate
__kernel void rnd_float32_matrix (
  __global float * res
) {
  uint idx = get_global_id(0);

  res[idx] = idx;
}

然后我使用以下代码创建并执行内核...

   // Some more code

   cl::Program program(context, sources, &err);
   program.build(devices, NULL, NULL, NULL);
   cl::Kernel kernel(program, "rnd_float32_matrix", &err);
   kernel.setArg(0, src_d);

   cl::CommandQueue queue(context, devices[0], 0, &err);

   cl::Event event;

   err = queue.enqueueNDRangeKernel(
      kernel,
      cl::NullRange,
      cl::NDRange(8),
      // I've tried cl::NDRange(8) as well
      cl::NDRange(1),
      NULL,
      &event
    );

   event.wait();

   err = queue.enqueueReadBuffer(
      // This is:
      //   cl::Buffer src_d(
      //     context,
      //     CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,
      //     mem_size,
      //     src_h,
      //     &err);
      src_d,
      CL_TRUE,
      0,
      8,
      // This is float * src_h = new float[8];
      src_h);

   for(int i = 0; i < 8; i ++) {
    std::cout << src_h[i] << std::endl;
   }

我可能没有在代码中显示它,但我也确实选择了一个 gpu 设备并使用 context.getInfo(..) 它显示我正在使用我的 NVidia GTX 770M 卡,它显示 1024、1024、64 个工作项在维度 0、1 和 2 中可用。当此数组打印时,我不断得到... 0、1、0、0、0、0、0、0。我还尝试设置 res[idx] = 5,并且我get... 5, 5, 0, 0, 0, 0, 0, 0。所以看起来实际上只使用了两个 give 工作项。我做错了什么?

最佳答案

您从设备读取数据的命令仅读取 8 个字节,即两个 float :

err = queue.enqueueReadBuffer(
  src_d,
  CL_TRUE,
  0,
  8, // <- This is the number of bytes, not the number of elements!
  // This is float * src_h = new float[8];
  src_h);

要读取 8 个 float ,您需要这样做:

err = queue.enqueueReadBuffer(
  src_d,
  CL_TRUE,
  0,
  8 * sizeof(cl_float),
  // This is float * src_h = new float[8];
  src_h);

关于c++ - 并非所有工作项目都在使用 opencl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30091446/

相关文章:

c++ - 默认移动构造函数

linux - 两个默认网关上的路由问题

memory-management - 在 OpenCL 内核中创建本地数组动态

opencl - 我可以分配大于 CL_DEVICE_MAX_MEM_ALLOC_SIZE 的内存吗?

c++ - C++ 中类似属性的特性?

c++ - 将 Leap 和 QT 连接在一起

linux中两个进程之间的上下文切换

c - 让 gcc 通过寄存器传递参数

OpenCL AMD 与 NVIDIA 性能对比

C++,ShellExecute a URL with the hash sign (#)