我正在为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上。
答案 0 :(得分:2)
这些库,特别是推力,试图尽可能通用,优化通常需要专门化:例如,算法的特化可以使用共享内存用于基本类型(如int或float),但通用版本不能。碰巧在特定情况下缺少专业化!
尽可能使用这些经过良好测试的通用库是个好主意,但有时候,对于某些性能关键部分,您自己的实现是一个需要考虑的选项。
在您的情况下,您需要针对不同的行并行进行多次扫描。一个好的实现不会为不同的行分别运行扫描:它将同时为所有行的所有元素运行相同的内核调用。根据其索引,线程可以知道它正在处理哪一行,并将忽略该行之外的所有数据。
这种专业化需要一个函子,它返回一个吸收值来阻止混合行。不过,你自己的谨慎实施可能会更快。
答案 1 :(得分:2)
要编写自己的前缀扫描,可以参考
要做多前缀和,你可以多次启动相同的内核(如a.lasram所建议)或尝试通过CUDA流实现cuncurrency,虽然我不知道这会对你的卡有效。