GPU 性能取决于元素数量 (problem_size)
GPUs performance depends on number of elements (problem_size)
我正在使用 CUDA 开发计算流体动力学 (CFD) 代码。当我在单个 Tesla K40 GPU(与 Intel Xeon E5 v2 CPU 相比)上针对不同的问题大小进行一些加速测试时,GPU 通过增加问题大小显示出更高的加速。例如,对于约 100 万个元素,我得到了约 1.5 倍的加速,而对于 1000 万个元素,它提高了约 11 倍。
我不知道理论上是什么导致了更大问题的更高性能?实际上,这也是我在 GPU 上的许多科学(尤其是流体力学)应用程序 运行 中看到的情况。 (我想知道内核开销、延迟等是否受到影响?)
感谢您的回答或评论!
PS:这里所说的加速比,我指的是GPU代码的执行时间与CPU版本的执行时间之比。实际上,我增加了两个版本的问题大小(当然,在每个比较测试中都对两者应用相同的问题大小)并重新计算相应问题大小的加速比。
原因是运行GPU内核通常会带来常数时间的开销(可能不是常数但我们可以考虑常数的情况),例如内核启动开销、PCIe数据传输等。
假设这个恒定的 GPU 开销成本 t
秒,GPU 速度是 g
百万元素每秒,CPU 速度是 c
百万元素每秒。两种速度都是恒定的(@havogt 所指示的可能不正确)。 CPU 没有开销。你有等式
(t + 1 / g) * 1.5 = 1 / c
(t + 10 / g) * 11 = 10 / c
然后你可以获得
g / c = 37.125
t = 0.640 / c
这意味着
- 对于足够大的数据元素 (>100M),GPU 速度接近 CPU 速度的 37.125 倍;
- 常数开销时间等于在CPU上处理0.640M个元素的时间。
我正在使用 CUDA 开发计算流体动力学 (CFD) 代码。当我在单个 Tesla K40 GPU(与 Intel Xeon E5 v2 CPU 相比)上针对不同的问题大小进行一些加速测试时,GPU 通过增加问题大小显示出更高的加速。例如,对于约 100 万个元素,我得到了约 1.5 倍的加速,而对于 1000 万个元素,它提高了约 11 倍。
我不知道理论上是什么导致了更大问题的更高性能?实际上,这也是我在 GPU 上的许多科学(尤其是流体力学)应用程序 运行 中看到的情况。 (我想知道内核开销、延迟等是否受到影响?)
感谢您的回答或评论!
PS:这里所说的加速比,我指的是GPU代码的执行时间与CPU版本的执行时间之比。实际上,我增加了两个版本的问题大小(当然,在每个比较测试中都对两者应用相同的问题大小)并重新计算相应问题大小的加速比。
原因是运行GPU内核通常会带来常数时间的开销(可能不是常数但我们可以考虑常数的情况),例如内核启动开销、PCIe数据传输等。
假设这个恒定的 GPU 开销成本 t
秒,GPU 速度是 g
百万元素每秒,CPU 速度是 c
百万元素每秒。两种速度都是恒定的(@havogt 所指示的可能不正确)。 CPU 没有开销。你有等式
(t + 1 / g) * 1.5 = 1 / c
(t + 10 / g) * 11 = 10 / c
然后你可以获得
g / c = 37.125
t = 0.640 / c
这意味着
- 对于足够大的数据元素 (>100M),GPU 速度接近 CPU 速度的 37.125 倍;
- 常数开销时间等于在CPU上处理0.640M个元素的时间。