【问题标题】:Passing std::vector to openCL kernel C++ bindings将 std::vector 传递给 openCL 内核 C++ 绑定
【发布时间】:2018-03-06 03:16:37
【问题描述】:

我是 OpenCL 的新手。 我想使用 C++ 绑定将向量传递给 OpenCL 内核。

目前我在宿主程序中:

std::vector<cl_float4> toKernel;
std::vector<cl_float3> output;
int n = 50;

//init some value in toKernel vector
//make kernel, program, command queue, etc...

cl::Buffer bufferX = cl::Buffer(
      context,
      CL_MEM_READ_ONLY,
      vectorSize * sizeof(cl_float4)
    );

cl::Buffer bufferNumber = cl::Buffer(
      context,
      CL_MEM_READ_ONLY,
      sizeof(int)
    );

cl::Buffer bufferOutput = cl::Buffer(
      context,
      CL_MEM_WRITE_ONLY,
      vectorSize * sizeof(cl_float3)
    );


queue.enqueueWriteBuffer(
      bufferX,
      CL_TRUE,
      0,
      vectorSize * sizeof(cl_float4),
      toKernel.data()
    );
queue.enqueueWriteBuffer(
      bufferNumber,
      CL_TRUE,
      0,
      sizeof(int),
      &n
    );

kernel.setArg(0, bufferX);
kernel.setArg(1, bufferNumber);
kernel.setArg(2, bufferOutput);

cl::NDRange global(vectorSize);
    cl::NDRange local(1);
    queue.enqueueNDRangeKernel(
      kernel,
      cl::NullRange,
      global,
      local
    );

queue.enqueueReadBuffer(
      bufferOutput,
      CL_TRUE,
      0,
      vectorSize * sizeof(cl_float3),
      &output
    );

在我的内核程序中,我像这样访问每个向量值:

__kernel void calculate(__global const float4 *x, __global const int *n, __global float3 *out){
    int i = get_global_id(0);
    for (int j=0; j<n; j++) {
         //do some calculation using x[i] and x[j]....
    }

    out[i] = calc_result;
}

这是正确的方法吗? 我不确定如何在 OpenCL 中输出调试消息。 当我尝试从内核读取输出时,我得到了 clEnqueueReadBuffer(-5)。 如何从 OpenCL 中读回 std::vector?

【问题讨论】:

  • 试试output.data()。它比您忘记为第一项添加索引的&amp;output[0] 更好。如果这不起作用,请检查主机和设备中 cl_float3 的大小及其对齐要求。它们可能不同。您是否在将地址传递给内核之前调整了输出大小?如果没有分配内存,opencl 只是假设它有内存并写入一个非法地址。

标签: c++ opencl


【解决方案1】:

-5 表示“资源不足”。您不能将output 作为指向enqueueReadBuffer 的指针传递。你需要通过output.data()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多