繁体   English   中英

有人可以解释这个OpenCL程序有什么问题吗?

[英]Can someone explain what is wrong with this OpenCL program?

我包括了主机程序的主要部分,我怀疑这是不正确的:

http://pastebin.com/qVkv9E11

我对指针还不是很好,并且认为我可能分配了一些错误的变量。

这是内核程序,它应该让我了解我的程序正在尝试做什么:

    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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM