6

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

我已经尝试过 Thrust 库中的那个,但它太慢了。在使用 nvcc 调试标志 (-g -G) 编译后也会导致崩溃。

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

有人知道用什么来代替这两个库吗?

R。

4

2 回答 2

2

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

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

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

这种特殊化需要一个返回一个吸收值的函子,以防止混合行。尽管如此,您自己的仔细实施可能会更快。

于 2013-09-01T18:48:15.597 回答
2

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

  1. CUDA SDK的扫描示例;
  2. N. Wilt 的第 13 章,“CUDA 手册”;
  3. S. Cook 的第 6 章,“CUDA 编程,使用 GPU 进行并行计算的开发人员指南”;
  4. 使用 CUDA 的并行前缀和(扫描)

要进行多前缀和,您可以多次启动相同的内核(如 a.lasram 所建议的那样)或尝试通过 CUDA 流实现并发,尽管我不知道这对您的卡是否有效。

于 2013-09-01T20:35:52.453 回答