CUDA中共享内存的并行扫描

4

我有一个问题,每个线程块(1维)必须在共享内存中的数组上运行扫描,并与其他任务一起完成。该数组最多有1024个元素。

是否有任何好的库支持这种类型的操作?

我检查了Thrust和CudPP,但它们都仅适用于数据最初在全局内存中的情况,这不是我想要的,因为我不想为每个小段开始新的内核并将数据复制回全局内存,因为这会产生相当大的开销。

如果没有公共库支持此类操作,那么如果我想要编写此操作仅一次并在几个不同的问题中使用它,您有什么建议?

我的第一个想法是编写一个简单的设备函数来运行扫描操作,但是可能可以从非内核函数调用该设备函数并访问共享内存并执行__syncthreads()操作吗?

我的另一个想法是在宏中编写整个函数,然后它可以工作,因为预处理器将代码复制到内核代码中,但编写如此复杂的宏并不是使用宏的最佳方法。

附:我有流式多处理器版本2.1,因此无法从另一个内核启动新内核(没有CUDA动态并行性)。

1个回答

5
有没有支持这种操作的好的库?如果没有公共库支持这种操作,那么如果我想只写一次此操作并在多个不同的问题中使用它,你有什么建议吗?
有一个名为CUB的库 - 代表CUDA UnBound。您可以在这里找到它。它提供了扫描功能。 如果您想自己编写类似的内容,则可以参考CUB的实现方式。
我的第一个想法是编写一个简单的主机函数来运行扫描操作,但是是否可能从不是内核函数的设备函数访问共享内存并执行__syncthreads()操作?
我不确定您所说的“运行扫描操作的主机函数”是什么意思。 从主机代码中唯一可以做的事情是启动内核和内存复制。除非设备函数是从拥有相关共享内存的块中调用的,否则答案是否定的。 共享内存是每个块分配的,并且仅可从块内部访问。

感谢回答,CUB正是我要寻找的。我想编写一个设备函数而不是主机函数,我只是误写了它。 - SqrtPi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接