在CUDA中共享内存中的并行扫描

Sqr*_*tPi 4 cuda shared-memory

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

有没有好的图书馆支持这种类型的操作?

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

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

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

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

RoB*_*BiK 5

有没有好的图书馆支持这种类型的操作?

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

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

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

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