OpenCL 字符限制
OpenCL char limit
printsomestuff
的两个实现只会写入 res[7](即:WORLD![=13=]
或 !ELLOWO[=14=]
)
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';
}
sizeof(A)
when A
is a char*
是指针的大小,而不是数组的长度。因此,如果您将 char A[16]
传递给此函数:
kernel void printsomestuff(__global char *A, __global char *B,
__global char *res) {
sizeof(A)
将是指针的大小,通常为 4 或 8 char
s。它不知道长度。
您需要将大小作为单独的参数提供,或者使用为承载此类数据而创建的类型,例如 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
printsomestuff
的两个实现只会写入 res[7](即:WORLD![=13=]
或 !ELLOWO[=14=]
)
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';
}
sizeof(A)
when A
is a char*
是指针的大小,而不是数组的长度。因此,如果您将 char A[16]
传递给此函数:
kernel void printsomestuff(__global char *A, __global char *B,
__global char *res) {
sizeof(A)
将是指针的大小,通常为 4 或 8 char
s。它不知道长度。
您需要将大小作为单独的参数提供,或者使用为承载此类数据而创建的类型,例如 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