Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cuda 阿姆达尔';s定律与GPU_Cuda_Parallelism Amdahl - Fatal编程技术网

Cuda 阿姆达尔';s定律与GPU

Cuda 阿姆达尔';s定律与GPU,cuda,parallelism-amdahl,Cuda,Parallelism Amdahl,我对阿姆达尔定律在GPU中的应用有一些疑问。例如,我有一个内核代码,我已经启动了许多线程,比如说N。那么,在阿姆达尔定律中,处理器的数量将是N,对吗?另外,对于任何使用大量线程的CUDA编程,我是否可以安全地假设Amdahl定律被简化为1/(1-p),其中p代表并行代码? 谢谢 例如,我有一个内核代码,我已经启动了一个数字 线程的数量,比如说,在阿姆达尔定律中,处理器的数量 你说得对吗 不完全是。GPU的物理核数(K)不如可以启动的线程数(N)多(通常,K大约是103,N在104到106之间)。

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

例如,我有一个内核代码,我已经启动了一个数字 线程的数量,比如说,在阿姆达尔定律中,处理器的数量 你说得对吗

不完全是。GPU的物理核数(K)不如可以启动的线程数(N)多(通常,K大约是103,N在104到106之间)。然而,内核的大部分时间(通常)只是等待数据从全局内存读/写到全局内存,因此一个内核可以无缝地处理多个线程。通过这种方式,设备可以处理多达N0个线程,而不会相互干扰,其中N0通常比K大几倍,但实际上取决于内核函数

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

另外,对于任何使用大量线程的CUDA编程,是吗 我可以放心地假设阿姆达尔定律简化为1/(1-p) 其中p代表并行代码

这个假设基本上意味着你忽略了代码的并行部分的时间(它是无限快执行的),并且只考虑串行部分的时间。 例如,如果在GPU上计算两个100元素向量的总和,那么初始化设备、数据复制、内核启动开销等(串行部分)比内核执行(并行部分)花费的时间要多得多。然而,通常情况并非如此

此外,单个GPU内核的性能与CPU内核不一样,因此您应该进行一些扩展,使阿姆达尔定律
1/[(1-p)+k*p/N]
(最简单的是,
k=Frequency(CPU)/Frequency(GPU)
,有时k会增加更多以考虑架构差异,比如CPU内核具有SIMD块)


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

首先,阿姆达尔定律假设给定无限多个核,并行部分立即执行。这一假设是不正确的(尽管有时可能相当准确)。即使计算两个向量的和,计算速度也不能超过添加两个字节的速度。人们可以忽略这个“量子”,或者将它包含在算法的串行部分,但它在某种程度上“打破”了这个想法

就我所知,如何在阿姆达尔定律中正确估计势垒同步、临界截面、原子操作等的影响是一个悬而未决的谜。这类操作属于并行部分,但它们的执行时间充其量与线程数无关,充其量与线程数呈正相关

简单示例:CPU集群中计算节点之间的广播时间按
O(logn)
的比例缩放。一些初始初始化可能需要多达
O(N)
时间

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


因此,在我看来,编写应用程序、衡量其性能并用它绘制阿姆达尔曲线通常比事先正确估计算法和硬件的所有细微差别要简单。如果很容易做出这样的估计,它们通常是显而易见的,没有任何“定律”。

根据您的理由,使用GPU,代码可以有几乎无限的加速,这肯定是不正确的。如果在GPU上运行的线程比实际的ALU多得多,经过一些
N
之后,设备将饱和,线程数加倍将使处理它们所需的时间加倍。在我看来,即使是在“经典”CPU集群上,由于复杂的同步方案等原因,阿姆达尔定律也不适用。它显示了并行化的一般思想,但不适用于实际性能评估。我同意饱和部分。阿姆达尔定律中的曲线显示,一旦处理器数量达到2000个左右,就会出现饱和。但是,对于像GPU这样的异构计算系统,Amdahl不是有一个修改吗?程序员可以计算理论上的加速?实际的加速取决于太多无法充分估计的值。例如,所使用的内存类型在GPU上起着非常重要的作用,“出错”可能会导致性能下降30倍(在CPU上,感知缓存也可以提高一些速度,但不会太快),尽管代码的“并行”和“串行”部分基本上保持不变。在国际海事组织看来,最好的估算方法是查看类似项目(例如,A定律)所取得的结果。A定律的主旨是,由于并行性而导致的加速受到代码中不并行部分的限制。这是真的,不管你说的是什么额外的同步和常数,它同样适用于GPU和任何并行系统。因此,我的问题是:对于GPU,特别是对于运行多个线程的程序,a定律将被弃用为1/(1-p)或者我可能忽略了针对异构系统的法律修改?