4

我有一个问题,每个线程块(一维)必须对共享内存内的一个数组进行扫描,并执行几个其他任务。(该数组最多有 1024 个元素。)

有没有支持这种操作的好库?

我检查了 Thrust 和 CudPP 但它们都只在数据最初位于全局内存中时才起作用,这不是我想要的,因为我不想为很少的工作启动一个新内核并将数据复制回全局内存,因为它有相当大的开销。

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

我的第一个想法是编写一个简单的设备函数来运行扫描操作,但是是否可以从不是内核函数的设备函数访问共享内存并执行 __syncthreads() 操作?我的另一个想法是在宏中编写整个函数,然后它会起作用,因为预处理器将代码复制到内核代码,但编写如此复杂的宏并不是使用宏的最佳方式。

PS.:我有流式多处理器版本 2.1,所以我不能从另一个启动新内核。

4

1 回答 1

5

有没有支持这种操作的好库?

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

有一个名为 CUB 的库 - 代表 CUDA UnBound。你在这里找到它。它提供扫描功能。
如果您想自己编写类似的东西,CUB 可能有助于了解它是如何完成的。

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

我不确定“运行扫描操作的主机功能”是什么意思。
您可以从主机代码中做的唯一一件事就是启动内核和内存副本。除非从拥有相关共享内存的块中调用设备函数,否则答案是否定的。
共享内存是按块分配的,并且只能从块内部访问。

于 2013-03-10T11:27:16.627 回答