MPI实现fft的迭代算法 源于并行计算——结构。算法。编程中伪码 更新2
来源:互联网 发布:java线程join方法 编辑:程序博客网 时间:2024/05/29 07:32
在实际使用中,更新1虽然看上去将计算和通信overlap了,但是,由于每次socket传输都会导致进入系统态,各种中断,更新cache,反而会很慢。而且,系统会对socket数量有限制。在我的实验环境中,以太网只允许开1k个socket,即单节点只能有1k个isend,这样严重妨碍了系统规模的扩大。所以,统一通信能获得更好的时间效果。更新通信方式。
#include "mpi.h"#include <stdio.h>#include <stdlib.h>#include <math.h>#include <sys/stat.h>#include <memory.h>typedef struct {double real;double img;} com;double PI;int readBinary(char* file,void *buf,int fsize);//if named read causes override and miscallint writeBinary(char *file,com *array,int size);//don't use the omega array,not every node needs a whole copy of omega,not efficientstatic inline void cp(com f,com *t);//copy complexstatic inline void add(com a,com b,com* r);static inline void mul(com a,com b,com* r);static inline void sub(com a,com b,com* r);int br(int src,int size);//bit reversevoid send(com *c,com *r,int s,int t);void show(com a) {printf("%.4f %.4f \n",a.real,a.img);}int main(int argc,char *argv[]) {if(argc<3) {printf("wtf\n");return 1;}double st,et;PI=atan(1)*4;int self,size;//process id and total number of processesMPI_Init(&argc,&argv);st=MPI_Wtime();MPI_Comm_rank(MPI_COMM_WORLD,&self);MPI_Comm_size(MPI_COMM_WORLD,&size);int fsize,n;void *buf;com *in;if(0==self) {//printf("start \n");struct stat fstat;stat(argv[1],&fstat);fsize=fstat.st_size;buf=malloc(fsize);n=readBinary(argv[1],buf,fsize)/2;//n stands for total complex number}MPI_Bcast(&n,1,MPI_INT,0,MPI_COMM_WORLD);//every thread should know the total sizeif(-1==n) {printf("error reading \n");MPI_Finalize();}in=(com*)malloc(n*sizeof(com));if(0==self) {memcpy(in,((int*)buf+1),n*sizeof(com));free(buf);}int psize=n/size;//datacom w,m;//omegacom t[psize];int l=log(n)/log(2);int off=self*psize;//initialize data each roundMPI_Bcast(in,n*2,MPI_DOUBLE,0,MPI_COMM_WORLD);for(int h=l-1;h>=0;--h) {//calculateint p=pow(2,h);int q=n/p;int k;for(k=off;k<off+psize;++k) {if(k%p==k%(2*p)) {int time=p*(br(k,l)%q);w.real=cos(2*PI*time/n);w.img=sin(2*PI*time/n);mul(in[k+p],w,&m);add(in[k],m,&t[k-off]);} else {int time=p*(br(k-p,l)%q);w.real=cos(2*PI*time/n);w.img=sin(2*PI*time/n);mul(in[k],w,&m);sub(in[k-p],m,&t[k-off]);}}MPI_Allgather(t,2*psize,MPI_DOUBLE,in,2*psize,MPI_DOUBLE,MPI_COMM_WORLD);}//MPI_Bcast(in,n*2,MPI_DOUBLE,0,MPI_COMM_WORLD);//reverse all dataint rs=0;for(int k=off;k<off+psize;++k) {//post all comunications first//tag is always the sending row numbert[k-off]=in[br(k,l)];}MPI_Gather(t,psize*2,MPI_DOUBLE,in,psize*2,MPI_DOUBLE,0,MPI_COMM_WORLD);if(0==self) {/*for(int i=0;i<n;++i) {printf("b%d :%.4f %.4f \n",i,in[i].real,in[i].img);}*/writeBinary(argv[2],in,n);}free(in);et=MPI_Wtime();MPI_Finalize();printf("%f \n",et-st);return 0;}int readBinary(char* file,void *buf,int fsize) {FILE *in;if(!(in=fopen(file,"r"))) {printf("can't open \n");return -1;}fread(buf,sizeof(char),fsize,in);int size=((int*)buf)[0];fclose(in);return size;}int writeBinary(char *file,com *array,int size) {FILE *out;if(!(out=fopen(file,"w"))) {printf("can't open \n");return -1;}int bsize=sizeof(int)+size*sizeof(com);void *buf=malloc(bsize);((int*)buf)[0]=2*size;memcpy(((int*)buf+1),array,size*sizeof(com));fwrite(buf,sizeof(char),bsize,out);free(buf);fclose(out);return 0;}void cp(com f,com *t) {t->real=f.real;t->img=f.img;}void add(com a,com b,com *c) {c->real=a.real+b.real; c->img=a.img+b.img; } void mul(com a,com b,com *c) { c->real=a.real*b.real-a.img*b.img; c->img=a.real*b.img+a.img*b.real; }void sub(com a,com b,com *c) { c->real=a.real-b.real; c->img=a.img-b.img; } int br(int src,int size) {int tmp=src;int des=0;for(int i=size-1;i>=0;--i) {des=((tmp&1)<<i)|des;tmp=tmp>>1;}return des;}
特别是在infiniband下,这个算法要快上十几倍。
- MPI实现fft的迭代算法 源于并行计算——结构。算法。编程中伪码 更新2
- MPI实现fft的迭代算法 源于并行计算——结构。算法。编程中伪码
- MPI实现fft的迭代算法 源于并行计算——结构。算法。编程中伪码 更新1
- MPI实现fft的迭代算法 源于并行计算——结构。算法。编程中伪码 更新3
- 串行fft 源于并行计算——结构。算法。编程中伪码
- 求解定积分的并行算法——基于MPI
- 基于MPI的PSRS并行排序算法的实现
- 利用MPI求解全源最短路径的并行算法实现
- Jacobi迭代并行算法
- FFT的迭代程序实现——hdu1402
- MPI实现并行计算统计数据
- pyspark实现Apriori算法、循环迭代、并行处理
- FOX算法的MPI实现
- Java实现算法导论中快速傅里叶变换FFT迭代算法
- Floyd-Warshall算法及其并行化实现(基于MPI)
- 【CUDA并行编程之六】KNN算法的并行实现
- 【CUDA并行编程之六】KNN算法的并行实现
- FFT算法的DSP实现
- JQuery-第二章 选择器
- Eclipse中文注释乱码解决
- Spring--quartz中cronExpression
- Struts2异常:ognl.OgnlException: target is null for setProperty
- MPI实现fft的迭代算法 源于并行计算——结构。算法。编程中伪码 更新1
- MPI实现fft的迭代算法 源于并行计算——结构。算法。编程中伪码 更新2
- Asp.net 计数器
- 关于dword ptr 指令
- 黑马程序员-- .Net学习日记——c#中的循环结构
- 设计模式的五大设计原则
- ffmpeg解码流程
- linux 查看依赖库
- java 使用sourceforge.pinyin4j查询汉字拼音
- 黑马程序员-- .Net学习日记——c#面向对象-方法