我正在为我的CUDA项目寻找高性能的multiscan / multi prefix-sum (一个内核执行中的多行)函数。
我试过推力库中的那个,但它太慢了。使用nvcc调试标志(-g -G)编译后也会发生推力崩溃。
在推力失败后,我专注于cuDPP库,它曾经是CUDA工具包的一部分。cuDPP的性能非常好,但是库没有更新到最新的CUDA5.5,并且在使用内存检查器进行调试时,cudppMultiScan()函数中存在一些全局内存冲突问题。(cuda 5.5,nsight 3.1,visual studio 2010,gtx 260 cc 1.3)
有没有人知道用什么来代替这两个库?
R.
发布于 2013-09-02 02:48:16
这些库,特别是推力,试图尽可能的通用,优化通常需要专门化:例如,一个算法的专门化可以为基本类型(如int或float)使用共享内存,但泛型版本不能。
尽可能多地使用这些经过良好测试的泛型库是一个好主意,但有时,对于一些性能关键部分,您自己的实现是一个需要考虑的选项。
在您的情况下,您希望对不同的行并行执行多个扫描。一个好的实现不会对不同的行单独运行扫描:它将对所有行的所有元素同时运行相同的内核调用。根据它的索引,线程可以知道它正在处理哪一行,并将忽略该行之外的所有数据。
这样的专门化需要一个函数器,该函数器返回一个防止混行的吸收值。尽管如此,你自己仔细的实现可能会更快。
发布于 2013-09-02 04:35:52
要编写自己的前缀扫描,可以参考
要做多前缀求和,你可以多次启动相同的内核(根据a.lasram的建议),或者尝试通过CUDA streams实现cuncurrency,尽管我不知道这将有效地工作于你的卡。
https://stackoverflow.com/questions/18560272
复制相似问题