gpt4 book ai didi

c - opencl 赋值被搞砸了

转载 作者:行者123 更新时间:2023-11-30 15:47:41 25 4
gpt4 key购买 nike

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

最佳答案

你的问题是,如果你将变量声明为指针,又名:

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

关于c - opencl 赋值被搞砸了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17240086/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com