我正在尝试编写一个可以在3D立方体上运行的插值工具,但我不知道如何正确地获取这些值。 这是我的简化内核,它应该将值从一个数组重新分配给另一个数组
__kernel void interpolate(__global float* input, __global float* output){
output[0] = input[0];
output[1] = input[1];
output[2] = input[2];
output[3] = input[3];
output[4] = input[4];
}
如果我现在将输出数组读回到我的CPU代码中,我应该按照确切的顺序获取输入数组的值。 我知道上面的例子没有做任何聪明的事情,但我对这个原则感兴趣。
我应该得到的输出是:
input0: 42.392487
input1: 20.455040
input2: 3.366035
input3: 20.000000
input4: 0.948683
但我明白了:
output0: 42.392487
output1: 20.455040
output2: 20.000000
output3: 20.000000
output4: 20.000000
关于我在哪里出错的任何提示?
更新:(同样:添加了输入/输出声明并更新了CL_MEM_READ_ONLY)
这里是创建内存,将数据复制到设备并设置内核args
的代码float *input = malloc(sizeof(float)*counter);
float *output = malloc(sizeof(float)*counter);
input = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(input), intput, NULL);
output = clCreateBuffer(context, CL_MEM_WRITE_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(output), output, NULL);
err = clSetKernelArg(kernel, 0, sizeof(cl_mem), &input);
err = clSetKernelArg(kernel, 1, sizeof(cl_mem), &output);
答案 0 :(得分:1)
您的问题是,如果您将变量声明为指针aka:
cl_float *input = malloc(sizeof(cl_float)*counter);
cl_float *output = malloc(sizeof(cl_float)*counter);
然后
sizeof(input); // == 8
将返回浮点指针的大小(在您的情况下,使用64位系统,它返回8) 而不是数组的大小。
使你需要的数组大小来传递相同的参数而不是malloc:
sizeof(cl_float) * counter; // == size your array
因此您应该使用当前语句创建缓冲区:
input_buf = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(cl_float) * counter, intput, NULL);
output_buf = clCreateBuffer(context, CL_MEM_WRITE_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(cl_float) * counter, output, NULL);
答案 1 :(得分:0)
上述问题的解决方案是不使用
float *input = malloc(sizeof(float)*counter);
分配内存,而是这样做:
float input[counter];
一旦我改为代码,一切都开始工作了。这对我有用,但现在我有一个更复杂的问题,我将在一个单独的线程中列出,因为它与上述问题无关。
感谢所有帮助人员。