8

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

4

1 回答 1

15

例如,我有一个内核代码,我使用多个线程启动,比如 N。那么,在阿姆达尔定律中,处理器的数量将是 N 对吗?

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

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

此外,对于使用大量线程的任何 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 块)。


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

首先,阿姆达尔定律假设给定无限数量的内核,并行部分会立即执行。这个假设是不正确的(尽管有时它可能非常准确)。即使您计算两个向量的和,也无法比添加两个字节的速度更快。人们可以忽略这个“量子”,或者将它包含在算法的串行部分中,但它有点“打破”这个想法。

如何在阿姆达尔定律中正确估计屏障同步、临界区、原子操作等的影响,据我所知,这是一个未解之谜。这样的操作属于并行部分,但它们执行的 walltime 充其量是独立于线程数的,最坏的情况是正相关的。

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

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

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

于 2012-09-14T02:11:49.230 回答