opencl值赋值被搞砸了

时间:2013-06-21 16:29:19

标签: c opencl

我正在尝试编写一个可以在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);

2 个答案:

答案 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];

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

感谢所有帮助人员。