[英]Can someone explain what is wrong with this OpenCL program?
我包括了主机程序的主要部分,我怀疑这是不正确的:
我对指针还不是很好,并且认为我可能分配了一些错误的变量。
这是内核程序,它应该让我了解我的程序正在尝试做什么:
const char *KernelSource = "\n"
"__kernel void sumElements( \n"
" __global float* input, \n"
" __global float output, \n"
" __global int N) \n"
"{ \n"
" int i = get_global_id(0); \n"
" if(i < N) \n"
" output += input[i]; \n"
"} \n"
"\n";
也许这是导致错误的原因,因为我从未尝试过SIMT像上面那样写一个变量。 可以做这样的事情吗? 我需要获取数组中所有元素的总和。
如果您尝试实际回读输出的值,那么您也需要将其声明为指针。 现在,输出的值将作为内核参数复制进来,但是您对它所做的任何更改在内核结束后都会被忽略。
因此,将__global float output
更改为__global float* output
。 然后在您的内核中进行更改:
if(i < N)
output += input[i];
至
if(i < N)
*output += input[i];
您可能需要更改分配缓冲区的方式才能正常工作,但是已经很长时间了,因为我已经在OpenCL中完成了此操作,而我现在找到的文档在您的文档中没有显示任何明显的错误缓冲区。
这里要提一个警告:加法不是原子操作。 使用此设置,将不可避免地发生以下情况:您将有两个或多个线程读取* output的值,然后尝试在不同阶段将* output +1写回它。 因此,* output的值将小于其应有的值。
要解决此问题,您将需要使用OpenCL 原子操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.