![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并行计算实验
文章平均质量分 96
深圳大学 并行计算实验
绝不收费
这个作者很懒,什么都没留下…
展开
-
高斯-约旦消去法的MPI并行程序
但是进程数的增加也导致了进程间的通信越来越复杂,通信的开销越来越高,O(n)次的对O(n)级别的数据的广播的所需时间越来越高,远不是并行减少消元运算的增益所能抵消的。然后,还有计算线性方程组的最大误差,通过一个n*m的双层for循环将每个进程负责的线性方程组的所有行的最大误差local_dif计算出来,然后通过MPI_Reduce函数,从所有进程求解出来最大误差local_dif中,选取出一个最大误差max_dif,并由进行编号为0的进程输出最大误差的信息和进程运行时间的信息。结果,我一步步的调试起来。原创 2024-07-18 00:28:09 · 672 阅读 · 0 评论 -
归并的OpenMP并行程序
对此,我采用了cstdlib库中rand()函数获取一个0到RAND_MAX之间的随机整数,再将随机数乘以1.0变成double类型,再除以RAND_MAX,最终获得一个0到1之间的随机的浮点数,然后加上一个数组元素的值,这样就可以获得两个随机的有序的double类型的一维数组。之后,为了保证a数组中的子数组和b数组中的子数组在进行并行归并的时候,可以将数据归并到c数组中对应的位置,我这里采用了一个for循环,计算每段归并需要存储在c数组的什么位置,采用的是计算前后指针,然后进行存储和记录。原创 2024-07-18 00:11:46 · 524 阅读 · 0 评论 -
矩阵乘法的MPI并行程序
在广播完b数组后,需要考虑讲对a矩阵按行分割后的计算中,所需要那几行的数据发送给对应的进程,所以这里采用了在进程编号为0的进程中使用MPI_Recv函数将a数组的部分数据发送给对应的进程,而在其他编号的进程中使用MPI_Send函数接收进程编号为0的进程发送过来的a数组的数据。然后,我考虑到矩阵a和矩阵b的乘法中,在对矩阵a按行进行计算量的分割后,矩阵b的所有数据在后续计算中基本都会被不同程度的使用,所以需要考虑讲数组b广播给其他所有的进程。,赋值给double类型的变量t1,作为并行域计算的结束时间。原创 2024-07-18 00:18:37 · 845 阅读 · 0 评论 -
矩阵乘法的MPI并行程序
这主要是与前面代码描述部分中分析的“矩阵乘法过程中,每一个进程都平均需要完成q次的a数组子块数据交换和覆盖、q次的b数组子块数据交换和覆盖,以及q次子块矩阵的乘法”有关系,随着进程数的增加,子块大小在逐渐减少,每个进行子块矩阵的乘法的计算的时间开销在减小,通信的数据量大小是保持不变的,但是通信次数的增加和通信结点是在增加的。同时,程序中的三层for循环,计算进程中子块a和子块b的矩阵乘法中,我针对性的调整了for循环的顺序,来提高for循环过程中的cache的命中率,来提升程序的性能。原创 2024-07-18 00:25:07 · 981 阅读 · 0 评论 -
简单排序的OpenMP并行程序
同时,为了避免程序的多次间断的运行,导致程序运行时CPU的状态差,导致实验获取的结果误差较大,这里考虑,创建数组提前存储“1、2、4、8、16、32、64”,然后通过for循环将数值传入函数“double achieve(int thread_num)”中,获取运行时间,并计算出对应5次实验的平均值。同时,随着线程数增加,又会导致子数组的归并开销加大,线程调度的开销加大,所以当线程数增加到一定程度时,通过增加线程数的排序加速会逐渐消失,使得最后的运行时间和加数比逐渐趋于平缓。接着,考虑如何实现并行的排序。原创 2024-07-17 23:00:58 · 815 阅读 · 0 评论 -
矩阵乘法的OpenMP并行程序
同时,为了避免程序的多次间断的运行,导致程序运行时CPU的状态差,导致实验获取的结果误差较大,这里考虑,创建数组提前存储“1、2、4、8、16、32、64”,然后通过for循环将数值传入函数“double juzheng(int tp)”中,获取运行时间,并计算出对应5次实验的平均值。所以在高级语言的层面,除非通过编译器提供的方法或者本来的规定的语言的规则,否则,我们是无法轻易判断一个操作是原子操作的。根据对上述,表1和图2的分析可知,随着线程数的增加,矩阵乘法的运行时间逐渐下降,加速比逐渐上升。原创 2024-07-17 22:49:32 · 1052 阅读 · 0 评论 -
前缀和的OpenMP并行程序
同时,为了避免程序的多次间断的运行,导致程序运行时CPU的状态差,导致实验获取的结果误差较大,这里考虑,创建数组提前存储“1、2、4、8、16、32、64”,然后通过for循环将数值传入函数“double juzheng(int thread_num)”中,获取运行时间,并计算出对应5次实验的平均值。从而,避免了程序的多次间断的运行带来的误差。根据对上述,表1和图2的分析可知,随着线程数的增加,求长度为n=100000000的数组的前缀和,需要的时间在逐渐下降,加速比逐渐上升。原创 2024-07-17 23:10:11 · 1010 阅读 · 0 评论 -
寻找完数的OpenMP并行程序
同时,为了避免程序的多次间断的运行,导致程序运行时CPU的状态差,导致实验获取的结果误差较大,这里考虑,创建数组提前存储“1、2、4、8、16、32、64”,然后通过for循环将数值传入函数“double achieve(int thread_num,double)”中,获取运行时间,并计算出对应5次实验的平均值。首先,考虑如何判断一个数是否为完数,这里考虑采用试除法,求出该数的所有因数进行相加然后减去这个数,来获得该数的因子之和,然后与这个数本身进行比较,相等即为完数,反之久不是完数。原创 2024-07-17 22:54:29 · 980 阅读 · 0 评论