0

我是 CUDA 的新手,想了解更多关于优化内核启动条件以加快我的代码的信息。这是一个非常具体的场景,但我会尽量概括它,以便将来有类似问题的任何人都可以从中受益。

假设我有一个包含 300 个元素的数组(数组 A)作为输入发送到内核。这个数组由几个重复的整数组成,每个整数都有一个特定的设备函数。例如,数组 A 中每次出现 5 时,内核执行特定于 5 的函数。这些函数是设备函数。

我如何并行化这个问题是通过启动 320 个块(可能不是最佳数量),以便每个块将并行执行与其元素相关的设备功能。

CPU 将以串行方式处理整个问题,它将逐个元素地调用每个函数,而 GPU 将为每个块分配一个元素,以便所有 320 个块都可以访问相关的设备函数并同时计算.

理论上,对于大量元素,GPU 应该更快——至少我是这样,但在我的情况下不是。我的假设是,由于 300 个元素是一个很小的数字,CPU 总是比 GPU 快。

这是可以接受的,但我想知道的是如何将 GPU 执行时间至少减少一点。目前,CPU 需要 2.5 毫秒,GPU 大约需要 12 毫秒。

问题 1 - 我如何选择一开始就启动的最佳块/线程数?首先,我尝试了 320 个块,每个块有 1 个线程。然后是 1 个具有 320 个线程的块。执行时间没有真正的变化。调整块/线程的数量会提高速度吗?

问题 2 - 如果 300 个元素太小,为什么会这样?大约需要多少个元素才能看到 GPU 优于 CPU?

问题 3 - 我应该研究哪些优化技术?

如果有任何不清楚的地方,请告诉我,我会对此进行扩展。

提前致谢。

4

1 回答 1

1
  1. 在内部,CUDA 以 32 个一组(所谓的 warp)管理线程。如果每个块设备有 1 个线程,仍将执行其中的 32 个 - 31 个线程将简单地处于发散状态。这可能是一个占用问题,尽管您可能不会在您的设备上观察到它以及您的问题规模。给定多处理器 (SM) 可以执行的块数也有限制。AFAIR,GeForce 4x 可以在一个 SM 上运行多达 8 个块。因此,如果您有一个具有 8 个 SM 的设备,如果您的块大小为 1,则您可以同时运行 64 个线程。您可以使用称为占用计算器的工具来估计更好的块大小 - 或者您可以使用可视化分析器。
  2. 这只能通过分析来决定。有太多未知数 - 例如,您的内存访问与实际计算的比率是多少,您的任务的可并行化程度等。
  3. 我真的建议您从最佳实践指南开始。
于 2013-07-18T02:03:32.590 回答