0

我正在尝试编写一个适用于 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)

这是创建内存,将数据复制到设备并设置内核参数的代码

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);
4

2 回答 2

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);
于 2015-01-08T14:30:40.920 回答
0

上述问题的解决方法是不使用

float *input = malloc(sizeof(float)*counter);

分配内存,而是这样做:

float input[counter];

一旦我更改为代码,一切都开始工作了。这对我有用,但现在我有一个更复杂的问题,我将在单独的线程中列出,因为它与上述问题无关。

感谢您的所有帮助。

于 2013-06-22T01:58:32.350 回答