Amdahl定律和GPU

时间:2012-09-13 03:14:23

标签: cuda parallelism-amdahl

对于关于GPU的Amdahl定律的应用,我有一些疑问。例如,我有一个内核代码,我用很多线程启动,比如N.那么,在amdahl定律中,处理器的数量是N吗?此外,对于使用大量线程的任何CUDA编程,我可以安全地假设Amdahl定律减少到1 /(1-p),其中p代表并行代码吗? 感谢

1 个答案:

答案 0 :(得分:14)

  

例如,我有一个用数字启动的内核代码   线程,说N.所以,在amdahl定律中处理器的数量   N会对吗?

不完全是。 GPU没有与可以启动的线程数( N )一样多的物理内核( K )(通常, K 大约为10) 3 N 在10 4 -10 6 的范围内。但是,内核时间的很大一部分(通常)只是等待从/向全局内存读取/写入数据,因此一个内核可以无缝地处理多个线程。这样设备可以处理最多 N 0 线程而不会相互干扰,其中 N 0 是通常比 K 大几倍,但实际上取决于你的内核函数。

在我看来,确定此 N 0 的最佳方法是通过实验测量应用程序的性能,然后使用此数据来拟合Amdahl定律的参数:)

  

此外,对于使用大量线程的任何CUDA编程,是吗?   我可以安全地假设Amdahl定律减少到1 /(1-p)   其中p代表并行代码?

这个假设基本上意味着你忽略了代码并行部分的时间(无限快地执行),只考虑串行部分的时间。

E.g。如果你在GPU上计算两个100元素向量的总和,那么初始化设备,数据复制,内核启动开销等(串行部分)比内核执行(并行部分)需要更多的时间。但是,通常情况并非如此。

此外,单个GPU内核与CPU内核的性能不同,因此您应该进行一些扩展,使Amdah'l法1 / [(1-p) + k*p/N](最简单,k = Frequency(CPU) / Frequency(GPU),有时 k 增加得更多,例如具有SIMD块的CPU核心。)


我还可以反对将阿姆达尔定律直接应用于实际系统。当然,它显示了总体趋势,但它没有掌握一些非平凡的过程。

首先,Amdahl定律假设给定无限数量的核心,并行部分立即执行。这种假设不正确(尽管有时它可能非常准确)。即使计算两个向量的总和,也无法比添加两个字节更快地计算它。人们可以忽略这个“量子”,或将其包含在算法的连续部分中,但它有点“打破”了这个想法。

如果在Amdahl定律中正确估计障碍同步,临界区,原子操作等的影响,据我所知,是未解之谜。这些操作属于并行部分,但它们执行的挂载时间最多与线程数无关,最坏的情况是正相关。

简单示例:在CPU群集中计算节点之间的广播时间缩放为O(log N)。某些初始初始化最多可能需要O(N)次。

在简单的情况下,人们可以在一定程度上估计算法并行化的好处,但是(通常是CUDA的情况)使用并行处理的静态开销可能比并行处理本身节省更多的时间。

所以,在我看来,编写应用程序通常更简单,测量它的性能并用它来绘制Amdahl曲线,而不是试图先验正确估计算法和硬件的所有细微差别。如果可以很容易地做出这样的估计,那么它们通常很明显,没有任何“法律”。