【问题标题】:OpenCL char limitOpenCL 字符限制
【发布时间】:2020-10-01 15:29:52
【问题描述】:

printsomestuff 的两个实现最多只能写入 res[7](即:WORLD!\0!ELLOWO\0

main.cpp:

...
char A[16] = "HELLO ";
        cl::Buffer aBuf(context, CL_MEM_READ_WRITE, sizeof(A));

        char B[16] = "WORLD!";
        cl::Buffer bBuf(context, CL_MEM_READ_WRITE, sizeof(B));

        queue.enqueueWriteBuffer(aBuf, CL_TRUE, 0, sizeof(A) * sizeof(char), A);
        queue.enqueueWriteBuffer(bBuf, CL_TRUE, 0, sizeof(B) * sizeof(char), B);

        char res[16];
        cl::Buffer resBuf(context, CL_MEM_READ_WRITE, sizeof(res) * sizeof(char));

        cl::Kernel kernel(program, "printsomestuff");
        kernel.setArg(0, aBuf);
        kernel.setArg(1, bBuf);
        kernel.setArg(2, resBuf);

        queue.enqueueTask(kernel);
        //queue.enqueueNDRangeKernel(kernel, cl::NullRange, cl::NDRange(32), cl::NullRange);

        queue.enqueueReadBuffer(resBuf, CL_TRUE, 0, sizeof(resBuf), res);

        std::cout << res;
...

my_kernels.cl

kernel void printsomestuff(__global char *A, __global char *B,
                           __global char *res) {

  /*  for (int i = 0; i < 8; i++) {
      res[i] = B[i];
      res[i + 8] = A[i];
    }*/

  res[0] = '!';
  res[1] = 'E';
  res[2] = 'L';
  res[3] = 'L';
  res[4] = 'O';
  res[5] = ' ';
  res[6] = 'W';
  res[7] = 'O';
  res[8] = 'R';
  res[9] = 'L';
  res[10] = 'D';
  res[11] = '!';
  res[12] = '\n';
}

【问题讨论】:

    标签: c++ opencl opencl-c++


    【解决方案1】:

    Achar* 时,sizeof(A) 是指针的大小,而不是数组的长度。因此,如果您将 char A[16] 传递给此函数:

    kernel void printsomestuff(__global char *A, __global char *B,
                               __global char *res) {
    

    sizeof(A) 将是指针的大小,通常为 4 或 8 chars。它不知道长度。

    Demo 1

    您需要将大小作为单独的参数提供,或者使用为承载这种类型的数据而创建的类型,例如std::string

    如果您只有固定大小的 char 数组,您可以对您的函数进行一些调整以使其保留数组范围,如下所示:

    template<std::size_t Asize, std::size_t Bsize, std::size_t Ressize>
    kernel void printsomestuff(__global char (&A)[Asize], __global char (&B)[Bsize],
                               __global char (&res)[Ressize]) {
    

    (我真的不知道 __global 做了什么,但我会留下来)

    您现在拥有了需要在函数中使用的所有尺寸。
    Demo 2

    【讨论】:

    • 谢谢 Ted,实际上 res 太小了:"queue.enqueueReadBuffer(resBuf, CL_TRUE, 0, 16, res);"作品
    • @lemmer 很好,但尽量避免硬编码大小。如果您以后更改任何内容,将很难记住所有位置。
    • @Ruslan 哇,有很多东西要读。 :-) 长话短说;博士;我应该把它放回去吗?
    • 是的,我想是的。
    猜你喜欢
    • 2020-09-25
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 2015-03-07
    • 2013-10-30
    相关资源
    最近更新 更多