簡體   English   中英

OpenCL 字符限制

[英]OpenCL char limit

printsomestuff兩種實現都只會寫入 res[7] (即: WORLD!\\0!ELLOWO\\0

主.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';
}

sizeof(A)Achar*是指針的大小,而不是數組的長度。 所以,如果你將你的char A[16]傳遞給這個函數:

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

sizeof(A)將是指針的大小,通常為 4 或 8 個char 它不知道長度。

演示 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做了什么,但我會把它留在里面)

您現在擁有需要在函數中使用的所有尺寸。
演示 2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM