CUDA中的高性能前缀和/扫描功能,寻找推力,cuDA库替代品

时间:2013-09-01 16:06:05

标签: cuda thrust cudpp

我正在为CUDA中的项目寻找高性能多扫描/多前缀和(一个内核执行中的许多行)函数。

我尝试过Thrust库中的那个但是它太慢了。使用nvcc调试标志(-g -G)编译后也会发生崩溃。

在我与Thrust失败之后,我专注于cuDPP库,它曾经是CUDA工具包的一部分。 cuDPP性能非常好但是库没有最新的cuda 5.5,并且在使用内存检查器进行调试时,cudppMultiScan()函数中存在一些全局内存冲突问题。 (cuda 5.5,nsight 3.1,visual studio 2010,gtx 260 cc 1.3)

是否有人知道该使用什么而不是这两个库?

R上。

2 个答案:

答案 0 :(得分:2)

这些库,特别是推力,试图尽可能通用,优化通常需要专门化:例如,算法的特化可以使用共享内存用于基本类型(如int或float),但通用版本不能。碰巧在特定情况下缺少专业化!

尽可能使用这些经过良好测试的通用库是个好主意,但有时候,对于某些性能关键部分,您自己的实现是一个需要考虑的选项。

在您的情况下,您需要针对不同的行并行进行多次扫描。一个好的实现不会为不同的行分别运行扫描:它将同时为所有行的所有元素运行相同的内核调用。根据其索引,线程可以知道它正在处理哪一行,并将忽略该行之外的所有数据。

这种专业化需要一个函子,它返回一个吸收值来阻止混合行。不过,你自己的谨慎实施可能会更快。

答案 1 :(得分:2)

要编写自己的前缀扫描,可以参考

  1. CUDA SDK的扫描示例;
  2. N. Wilt第13章,“CUDA手册”;
  3. S. Cook的第6章,“CUDA编程,GPU开发并行计算开发人员指南”;
  4. Parallel Prefix Sum (Scan) with CUDA
  5. 要做多前缀和,你可以多次启动相同的内核(如a.lasram所建议)或尝试通过CUDA流实现cuncurrency,虽然我不知道这会对你的卡有效。