并行计算
文章平均质量分 75
使用C实现并行计算
快乐啊啊啊啊啊
大四摸鱼侠
展开
-
OpenMPI(二)消息的分发和收集
在中提到的点对点通信在数据操作量较大的场景下是不够高效的。为了减少通信时间,我们将采用Collective communication的通信方式,这种通信方式类似于群发消息,只需要发送一次就可以让所有进程收到信息。以下图片可以让大家更直观的理解这种通信方式的优点所在:如何进行Collective communication呢,以一个简单的计数场景为例。现有一个数组,通过并行运算统计数组中小于10的元素有几个:1.进程0告诉其他所有进程他们需要分配的内存空间是多少。2.进程0将数据分发给其他进程。原创 2024-03-05 18:19:03 · 973 阅读 · 0 评论 -
OpenMPI(一) 消息的发布和接收
而在并行运算中,分布式内存(distributed memory parallelism)也很常见,在这种情况下,每个操作单元独立的拥有一块内存,数据依赖关系将通过直接的交流解决,所以将不存在data race的问题。由于这是分布式的内存系统,其他进程无法直接访问到进程0所在的内存,也就无法直接读取到矩阵a的值。在这段代码中,localSize = 矩阵a的大小 / 总进程数,这样就可以把矩阵a平均分配给不同的进程进行计算。其他进程在接受到进程0发送的消息以后,会纷纷在自己的内存中进行矩阵加法。原创 2024-03-05 17:04:58 · 367 阅读 · 0 评论 -
OpenMP(三)#pragma omp critical
由于函数的前三步不存在多线程data race问题,每个线程都需要独立创造空间存放数据和指针,所以不需要将其纳入cirtical region。但这种方法是低效的,因为在代码执行过程中,只有一个线程可以抵达critical region,这本质上和按顺序执行没有区别。如果把*head指针或*tail变成private的,是不可行的,因为这两个指针是整个链表共享的,不是每个线程私有的。线程A再把值赋给head,覆盖掉了线程B的操作,最终导致2这个值丢失。改法2比改法1效率有所提升,但也称不上高效。原创 2024-03-03 16:13:53 · 534 阅读 · 0 评论 -
OpenMP(二)并行运算中的数据依赖问题
比如,线程A计算得到temp = 1以后,线程B计算得出temp = 2, 覆盖了A的结果,会导致线程A下的a[i]结果错误。这是一段简单的 数组a的元素 =(数组b的元素+数组c的元素)/ 2 的代码。在并行执行的情况下,可能线程A先执行,更改了数组的元素,导致线程B开始执行以后访问的数组已经是被A更改过的结果了。线程B判断set[1] > set[2],认为应该交换,并率先进行,数组变成 [3,1,2]A在B的基础上进行更改,交换set[0] 和set[1],数组变成 [1,3,2]原创 2024-03-02 17:17:21 · 607 阅读 · 1 评论 -
OpenMP(一) #pragma omp parallel for
因为每个线程都会执行一次内循环,如果线程A首先执行了内循环,改变了变量 i 的值(假如最终值2),那么线程B在开始执行内循环时,i的初始值为为2,它就会直接跳过几个像素块,造成问题。那么就是并行执行内循环,每个线程执行setPixelColour (i, j);这样执行的效率可能还不如直接按顺序执行。因为不断地创建和销毁线程需要额外的开销。对于嵌套for循环,#pragma omp parallel for放在内层和外层有什么区别呢?那么把#pragma omp parallel for放在外层循环呢?原创 2024-03-02 16:24:06 · 337 阅读 · 0 评论