我正在为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.
这些库(尤其是 Thrust)尝试尽可能通用,而优化通常需要专门化:例如,算法的专门化可以将共享内存用于基本类型(如 int 或 float),但通用版本则不能。碰巧对于特定情况缺少专业化!
尽可能多地使用这些经过良好测试的通用库是一个好主意,但有时,对于某些性能关键部分,您自己的实现是一个可以考虑的选项。
在您的情况下,您希望对不同的行并行进行多次扫描。一个好的实现不会对不同的行单独运行扫描:它会对所有行的所有元素同时运行相同的内核调用。根据其索引,线程可以知道它正在处理哪一行,并将忽略该行之外的所有数据。
这种专门化需要一个函子来返回一个吸收值,以防止混合行。尽管如此,您自己的仔细实施可能会更快。