并非所有工作项都使用opencl

时间:2015-05-07 03:32:01

标签: c++ linux opencl gpgpu nvidia

所以我能够编译和执行我的内核,问题是只使用了两个工作项。我基本上试图用{0,1,2,3,4,5,6,7}填充浮点数组[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,我得到... 5,5,0,0,0,0,0,0所以似乎实际上只有两个给出了工作项。我做错了什么?

1 个答案:

答案 0 :(得分:3)

从设备读取数据的命令只读取8个字节,即两个浮点数:

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个花车,您需要这样做:

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