对于阿姆达尔定律在 GPU 上的应用,我有一些疑问。例如,我有一个内核代码,我启动了多个线程,比如 N。那么,根据阿姆达尔定律,处理器的数量将是 N,对吗?另外,对于任何使用大量线程的 CUDA 编程,我是否可以安全地假设阿姆达尔定律简化为 1/(1-p),其中 p 代表并行代码? 谢谢
最佳答案
For instance, I have a kernel code that I have launched with a number of threads, say N. So,in the amdahl's law the number of processors will be N right?
不完全是。 GPU 的物理核心 (K) 数量不如您可以启动的线程数量 (N)(通常,K 约为 10 3,N 的范围为 104 - 106)。然而,内核时间的很大一部分(通常)花在等待从全局内存读取数据或向全局内存写入数据,因此一个核心可以无缝处理多个线程。这样,设备最多可以处理 N0 个线程,而不会相互干扰,其中 N0 是通常比K大几倍,但实际上取决于你的核函数。
在我看来,确定此 N0 的最佳方法是通过实验测量应用程序的性能,然后使用此数据来拟合阿姆达尔定律的参数:)
Also, for any CUDA programming using a large number of threads, is it safe for me to assume that the Amdahl's law is reduced to 1/(1-p) wherein p stands for the parallel code?
这个假设基本上意味着您忽略代码并行部分的时间(它执行得无限快),而只考虑串行部分的时间。
例如如果您在 GPU 上计算两个 100 元素向量的总和,则设备初始化、数据复制、内核启动开销等(串行部分)比内核执行(并行部分)花费更多时间。然而,通常情况并非如此。
此外,单个 GPU 核心的性能与 CPU 核心不同,因此您应该进行一些缩放,使 Amdah'l 定律 1/[(1-p) + k*p/N]
(最简单的是,k = 频率(CPU)/频率(GPU)
,有时 k 会增加更多,以考虑架构差异,例如 CPU 核心具有 SIMD block )。
我也可以反对将阿姆达尔定律应用于实际系统。当然,它显示了总体趋势,但它没有掌握一些重要的过程。
首先,阿姆达尔定律假设给定无限数量的内核,并行部分会立即执行。这个假设是不正确的(尽管有时它可能相当准确)。即使计算两个向量的总和,也无法比两个字节相加的速度更快。人们可以忽略这个“量子”,或者将其包含在算法的串行部分中,但这在某种程度上“破坏”了这个想法。
据我所知,如何正确估计阿姆达尔定律中屏障同步、临界区、原子操作等的影响仍然是一个未解之谜。此类操作属于并行部分,但其执行的walltime充其量与线程数无关,而在最坏的情况下,是正相关的。
简单示例:CPU 集群中计算节点之间的广播时间为 O(log N)
。某些初始初始化可能需要长达 O(N)
时间。
在简单的情况下,我们可以在一定程度上估计算法并行化的好处,但是(与 CUDA 的情况一样)使用并行处理的静态开销可能会比并行处理本身节省的时间花费更多的时间。
因此,在我看来,编写应用程序、测量其性能并使用它来绘制阿姆达尔曲线通常比尝试先验正确估计算法和硬件的所有细微差别更简单。如果这种估计很容易做出,那么它们通常是显而易见的,没有任何“规律”。
关于cuda - 阿姆达尔定律和 GPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12398929/