这个问题缺乏细节。因此,我决定创建另一个问题而不是编辑这个问题。新问题在这里:我可以并行化我的代码吗?还是不值得? https://stackoverflow.com/questions/17937438/can-i-parallelize-my-code-or-it-is-not-worth
我有一个在 CUDA 中运行的程序,其中一段代码在循环内运行(序列化,如下所示)。这段代码是在包含地址和/或 NULL 指针的数组中进行搜索。所有线程都执行下面的代码。
while (i < n) {
if (array[i] != NULL) {
return array[i];
}
i++;
}
return NULL;
Where n
的大小是array
并且数组位于共享内存中。我只对与 NULL(第一个匹配)不同的第一个地址感兴趣。
整个代码(我只发布了一段,整个代码很大)运行得很快,但是代码的“核心”(即重复较多的部分)是序列化的,如您所见。我想知道是否可以使用某些优化算法并行化这部分(搜索)。
就像我说的,程序已经在 CUDA 中(以及设备中的数组),因此它不会有从主机到设备的内存传输,反之亦然。
我的问题是:n
不大。很难大于 8。
我尝试对其进行并行化,但我的“新”代码比上面的代码花费了更多时间。
我正在研究归约和最小运算,但我已经检查过它在以下情况下很有用:n
is big.
那么,有什么建议吗?我可以有效地并行化它,即以较低的开销吗?
简单来说,GPGPU 代码的主要限制因素之一是内存管理。在大多数计算机中,将内存复制到设备 (GPU) 是一个缓慢的过程。
如图所示http://www.ncsa.illinois.edu/~kindr/papers/ppac09_paper.pdf http://www.ncsa.illinois.edu/~kindr/papers/ppac09_paper.pdf:
“获得有效的关键要求
GPU 子例程库的加速是最小化
主机和 GPU 之间的 I/O。”
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)