![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
做并行
为啥强制昵称
这个作者很懒,什么都没留下…
展开
-
MPI 实现并行直接插入排序
话说 直插排序串行只需要十几行 并行就大不一样。。。基本思路是 1/主线程控制数据读取 分发和汇总 2/从线程中数据按线程号非降有序 每次有新数据 主线程广播 从线程按照数据大小判断是否在自己处理范围内 如果在的话 在自己保存的数组中进行直接插入3/最后 主线程按序收集显示所有数据#include "mpi.h"#include #include #include原创 2012-08-01 16:49:55 · 2211 阅读 · 0 评论 -
MPI实现fft的迭代算法 源于并行计算——结构。算法。编程中伪码 更新2
在实际使用中,更新1虽然看上去将计算和通信overlap了,但是,由于每次socket传输都会导致进入系统态,各种中断,更新cache,反而会很慢。而且,系统会对socket数量有限制。在我的实验环境中,以太网只允许开1k个socket,即单节点只能有1k个isend,这样严重妨碍了系统规模的扩大。所以,统一通信能获得更好的时间效果。更新通信方式。#include "mpi.h"#incl原创 2012-10-12 15:09:56 · 1182 阅读 · 0 评论 -
方阵操作方法集
方阵的生成 读写文件 转置和显示#include #include #include #include #include using namespace std;templateint inline size(T type,char *file) { ifstream in(file); in.seekg(0,ios::end); int size=in.tellg()原创 2013-04-01 15:49:55 · 823 阅读 · 0 评论 -
SMP矩阵乘法
矩阵乘法的并行化基本都是用加农算法,但是在共享内存的情况下,我觉得加农并没有优势。加农保证了在每个变量全局单副本的情况下,并行度的提升。在共享内存时,没有变量复制的成本,所以直接使用带状划分可以避免迭代中间的barrier开销,提高效率。SMP下实现矩阵乘法#include "stdafx.h"#include "matrixOperation.h"#include int原创 2013-04-01 15:47:29 · 760 阅读 · 0 评论 -
pthread 快排 失败的优化版
为了改善快排并行度的问题,我设计了如下改进算法:用第一个元素做pivot,其余元素平均分配给可用线程,并行进行局部的快排(都与pivot做比较)。在作完比较之后,使用额外空间将所有数据归并到一起(使用memcpy)。进行下一次迭代。然后就出现了一系列的问题,其一就是for循环中声明的变量,在一次迭代结束后会被释放变量所占用内存(貌似是个栈),如果传递指向这块内存的指针,会出错。而且for循原创 2013-04-15 20:41:58 · 981 阅读 · 1 评论 -
pthread 快排 基础版
快排是一个很适合做并行的算法,因为一次划分相当于一次反归并,把数据划分为两个不相关的部分,可以并行处理。但是快排,包括归并排序都有一个缺点:并行度是变化的,而且最终会是1,即有一次迭代需要纯串行。经过一番思考,我拿出了一个改进版方案,由于对pthread不熟悉,还有懒,代码写的很烂。改进版见:pthread 快排 失败的优化版本文是基础的快排并行化,用算法导论的快排伪码改成。可以通过一个给原创 2013-04-15 20:24:56 · 1356 阅读 · 0 评论 -
MPI_File_read 读不出数据
昨天写程序,MPI_File_read读不出数据,error code和status.count都是很不正常的大数。查了很久似乎没人遇到过,但是明显不靠谱啊。。。最后明白了,文件的访问权限不够,需要用root运行才能读root创建的文件。。。原创 2013-04-18 20:05:09 · 939 阅读 · 0 评论 -
MPI 带状划分矩阵转置
MPI矩阵操作分两部分:1.读文件2.操作读文件的时候可以使用MPI_File_read来直接分配数据。矩阵存储的格式:连续内存空间,头两个int表示行列数,后续位置使用double表示数据,行优先存储。文件使用二进制方式直接存储矩阵内存块。转置非方阵,使用新申请的内存。如果使用O(1)的内存,并没有规则的交换的过程,所以不大现实,逻辑太复杂,太慢。#include原创 2013-04-19 14:28:49 · 2565 阅读 · 1 评论 -
torque 机群上 openmp+mpi混搭程序的提交
首先,程序编写与mpi单独要有区别,MPI_Init()要改为MPI_Init_thread(),还需要判断一下环境是否满足需求。其次,程序不能使用默认openmp 的线程数,因为,torque不能用qsub脚本设置计算节点的环境变量。而openmp默认线程数是由OMP_NUM_THREADS环境变量设置的。为了更好的适用性和可移植,把线程数用参数传入,使用omp_set_num_thread原创 2013-05-09 17:00:26 · 1954 阅读 · 0 评论 -
在Phi与host之间使用socket
Phi是intel推出的x86协处理器,运行轻量级linux,使用PCI-E与主机通信。但是,Phi上的print需要等到程序运行完才能显示,等程序运行完,黄花菜都凉了。而且瞬间几百行输出,谁有心思看啊。由此就有这个问题:实时显示。之前做过这方面的调研。不过是单机上的,这种类多机的没有试过,简单的解决方案是用socket,而双方都是linux,很容易开发。Host:#include原创 2014-04-01 22:02:56 · 953 阅读 · 0 评论 -
Linux IPC,FIFO和shm
偶尔发现了调试函数需要的一个功能:根据反馈的信息,调整一些简单的参数。有两个要求:1、不中断程序,又不会每次都需要暂停等待输入;2、不需要重新编译,程序运行。这样需求基本上就是多进程、监听加IPC就ok。首先想到的是使用环境变量。基本使用的是getenv()函数,获得相应的环境变量即可。在使用过程中,发现根本就不可能。因为环境变量是用户级别的,而每个console都相当于一个用户,不能进行原创 2014-02-26 21:27:13 · 2738 阅读 · 0 评论 -
自己实现的水版MPI_Bcast(使用binomial tree,跟mpich2实现思路一样)
二项树见http://hi.baidu.com/isswangqing/item/8e0908273e773d54c38d59bc非常适合bcast这个过程,因为没有额外的通信开销,集合的增加通信并行度。之前想到的,实现完了发现mpi也用了这个,而且还有其他的方法。过两天分析一下源码。#include #include #include int mpiSize, mpiRank;v原创 2013-05-23 22:16:05 · 1703 阅读 · 1 评论 -
MPI实现fft的迭代算法 源于并行计算——结构。算法。编程中伪码 更新3
allgather开销太大,所以,可以考虑用输入数据闭包的办法,避免通信。但是fft的碟形算法的输入闭包是所有数据。但是每次迭代的时候,节点间通信一定是以第2的某整数次幂开始的2的整数次幂个数据成块交换。所以,可以对并行度进行规定,让通信按块进行。#include "mpi.h"#include #include #include #include #include /* bo原创 2012-11-19 15:24:38 · 1778 阅读 · 0 评论 -
MPI实现fft的迭代算法 源于并行计算——结构。算法。编程中伪码
#include "mpi.h"#include #include #include #define T 0typedef struct { double real; double img;} com;double PI;//don't use the omega array,not every node needs a whole copy of omega,not e原创 2012-09-13 16:21:37 · 1534 阅读 · 0 评论 -
MPI实现fft的迭代算法 源于并行计算——结构。算法。编程中伪码 更新1
对于节点内部传送不通过mpi #include "mpi.h"#include #include #include #include #include typedef struct { double real; double img;} com;double PI;int readBinary(char* file,void *buf原创 2012-10-12 15:05:04 · 2638 阅读 · 0 评论 -
MPI 并行解方程
基本算法 逐步缩小函数值异号的范围 最后逼近最终解所有线程计算中地位相同 计算范围与self号相应的区段值 把x较小值做为解 只支持单个解lx做为计算范围和终止条件 最后 由主线程显示结果#include "mpi.h"#include #include #define END 999999#define CON 1#define RES 2//calculation v原创 2012-08-07 12:33:42 · 1987 阅读 · 0 评论 -
MPI 并行解上三角矩阵表示的方程组
最基本的回代法实现#include "mpi.h"#include #include #define ROOT 0#define TAG 0int main(int argc,char *argv[]) { float matrix[][4]={{2,3,4,5},//the upper trangular matrix representing a equation set原创 2012-08-08 18:53:42 · 2188 阅读 · 0 评论 -
MPI 加农算法
加农算法计算矩阵相乘 为了实现方便 只实现了矩阵自乘 而且 实际上各线程都可读取整个矩阵(略去输入和分配中的通信过程)在各线程相互交换数据的过程中 一定要注意避免死锁#include "mpi.h"#include #include #include #define TAG 0static inline void rtoij(int r,int w,int *i,int *j原创 2012-08-09 16:17:20 · 1337 阅读 · 0 评论 -
MPI 实现直接选择排序
选择排序 1/主线程完成读数据 分发 回收和过程控制2/从线程完成从自己的数据集上选出最小的数值 3/主线程 从收到的数据中选出最小的更新 通知相应线程 发来新的最小值 选择出下一个最小值 循环至完成#include "mpi.h"#include #include #include #include #include #define TAG 0#define原创 2012-08-04 22:55:09 · 1671 阅读 · 0 评论 -
MPI 堆排序
堆排是串行排序中最适合并行化的排序之一1/分为主线程和从线程2/主线程分发数据,使用大小与从线程个数相同的堆作为私有堆,进行最后整理用3/从线程维护一个堆,每次返回给主线程堆顶元素4/主线程 提取堆顶元素 通知相应从线程提交新的堆顶元素5/主从线程并行进行重建堆(heapify)的动作#include "mpi.h"#include #include #define原创 2012-08-13 17:01:44 · 962 阅读 · 0 评论 -
MPI 归并排序
n个处理器 归并n个数据 处理器按编号线性相连(一维线性阵列)每个处理器都有输出能力数据通过每次归并 数据向size/2 和size/2-1号处理器靠近 最后这两个处理器进行最后归并#include "mpi.h"#include #include #include static inline int next(int self,int m,int q) {//minimum t原创 2012-08-17 16:14:09 · 4538 阅读 · 0 评论 -
MPI 高斯消元
高斯消元 解方程组的预备工作 将矩阵化为上三角不分主从线程 每个线程负责一个方程#include "mpi.h"#include #include typedef struct{ float value; int rank;} MD;int main(int argc,char *argv[]) { int self,size; MPI_Status s; //equ原创 2012-08-24 15:03:08 · 4672 阅读 · 1 评论 -
MPI 实现雅可比迭代法
使用逼近的方法求方程组的解 只使用第i个方程计算第i个x的值 必须是对角占优的矩阵(否则结果会是正负无穷)每个线程负责某个x的计算 线程对整个矩阵都能完全直接访问 计算结果分别输出#include "mpi.h"#include #include //broadcast xvoid bcastx(float *xs,int size) { for(int i=0;i<size;原创 2012-08-27 18:38:30 · 5088 阅读 · 0 评论 -
串行fft 源于并行计算——结构。算法。编程中伪码
第三版 295页伪码,跟一般的计算方法的顺序有些不同,这个是先计算后改变位置。简单易懂,明了。陈国良果然大家。#include #include #include typedef struct { double real; double img;} com;double PI;void cp(com f,com *t);void add(com a,com b,com*原创 2012-09-13 16:14:59 · 1547 阅读 · 0 评论 -
MPI通过矩阵乘实现傅立叶变换
串行计算时,fft比传统矩阵乘的傅立叶变换有极大优势。但是,在并行条件下,迭代的fft需要大量的网内通信,overhead不是很好,而且并行度最高就是n,并不理想。相比于这个,传统的矩阵乘法的计算过程没有线程间通信,会有很大的效率提升。而且,如果计算每一行的乘法时使用openmp进一步增加并行度也是可行的,通信也不会有显著的增加。#include "mpi.h"#include #in原创 2012-09-13 19:27:33 · 1207 阅读 · 0 评论 -
Fatal error in MPI_Gather: Other MPI error,的一个解决方法
Fatal error in MPI_Gather: Other MPI error, error stack:MPI_Gather(761)...................: MPI_Gather(sbuf=0x7fffe81491f0, scount=8192, MPI_DOUBLE, rbuf=0x2ba3422b1010, rcount=8192, MPI_DOUBLE, roo原创 2012-10-06 11:18:39 · 10549 阅读 · 2 评论 -
[源码]Concurrent包之BlockingQueue、BlockingDeque
Java程序员不懂concurrent包可能很难说的过去,准备搞一系列文章,按照某外国小哥的思路看一遍concurrent包。小哥的文章主要是用法,我就主要看源码了。BlockingQueue同步的FIFO容器,主要方法: 实现有五种:ArrayBlockingQueue、DelayQueue、LinkedBlockingQueue、PriorityBlockingQueue、Synchron原创 2017-03-29 17:58:57 · 499 阅读 · 0 评论