Ani*_*hik 8 cuda parallelism-amdahl
关于GPU的Amdahl定律的应用,我有几个疑问.例如,我有一个内核代码,我用很多线程启动,比如N.那么,在amdahl定律中,处理器的数量是N吗?此外,对于使用大量线程的任何CUDA编程,我可以安全地假设Amdahl定律减少到1 /(1-p),其中p代表并行代码吗?谢谢
ala*_*and 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代表并行代码吗?
这个假设基本上意味着你忽略了代码并行部分的时间(它被无限快地执行)并且只考虑串行部分的时间.
例如,如果计算GPU上两个100元素向量的总和,那么初始化设备,数据复制,内核启动开销等(串行部分)比内核执行(并行部分)花费更多的时间.但是,通常情况并非如此.
此外,单独的GPU核心与CPU核心没有相同的性能,所以你应该做一些扩展,制定Amdah'l定律1 / [(1-p) + k*p/N]
(最简单的k = Frequency(CPU) / Frequency(GPU)
,有时k增加更多,以考虑架构差异,如CPU核心有SIMD块).
我也可以反对将阿姆达尔定律直接应用于实际系统.当然,它显示了总体趋势,但它没有掌握一些非平凡的过程.
首先,Amdahl定律假设给定无限数量的核心,并行部分立即执行.这种假设不正确(尽管有时它可能非常准确).即使计算两个向量的总和,也无法比添加两个字节更快地计算它.人们可以忽略这个"量子",或将其包含在算法的连续部分中,但它有点"打破"了这个想法.
如何在Amdahl定律中正确估计屏障同步,临界区域,原子操作等的影响,据我所知,是未解决的谜团.这些操作属于并行部分,但是它们执行的挂起时间最多与线程数无关,并且在最坏的情况下是正相关的.
简单示例:在CPU群集中计算节点之间的广播时间缩放为O(log N)
.一些初始初始化可能需要O(N)
时间.
在简单的情况下,人们可以在某种程度上估计算法并行化的好处,但是(通常是CUDA的情况)使用并行处理的静态开销可能比并行处理本身节省更多时间.
因此,在我看来,编写应用程序通常更简单,测量它的性能并用它来绘制Amdahl的曲线,而不是尝试先验地正确估计算法和硬件的所有细微差别.如果可以轻易做出这样的估计,那么它们通常很明显,没有任何"法律".