当前位置:首页 » 编程语言 » c语言mpi并行程序

c语言mpi并行程序

发布时间: 2023-05-24 12:27:52

c语言实现MPI并行计算程序。要求使用partitioning and divide and conquer思想

http://wenku..com/link?url=gAn5gITm-_haS-Hx4kMJ16TidLl8cr2GXxMvKJ_xMSQ7d2dUhI9Lp39ha

㈡ mpi 矩阵相乘 c语言

!
! a cross b.f
!
! Fixed-Format Fortran Source File
! Generated by PGI Visual Fortran(R)
! 2010-12-12 21:58:04
!
!Parallel matrix multiplication: main program

program cross
implicit double precision (a-h, o-z)
include 'mpif.h'
parameter (nbuffer=128*1024*1024/8)
dimension buf(nbuffer),buf2(nbuffer)
double precision time_start, time_end
external init, check, matmul

call MPI_Init(ierr)
call MPI_Comm_rank(MPI_COMM_WORLD, myrank, ierr)
call MPI_Comm_size(MPI_COMM_WORLD, nprocs, ierr)

if (myrank.eq.0) then
print *, 'Enter M, N, L: '
call flush(6)
read(*,*) M, N, L
endif
call MPI_Bcast(M, 1, MPI_INTEGER, 0, MPI_COMM_WORLD, ierr)
call MPI_Bcast(N, 1, MPI_INTEGER, 0, MPI_COMM_WORLD, ierr)
call MPI_Bcast(L, 1, MPI_INTEGER, 0, MPI_COMM_WORLD, ierr)

if ( mod(m,nprocs).ne.0 .or. mod(l,nprocs).ne.0 ) then
if (myrank.eq.0) print *, 'M or L cannot be divided by nprocs!'
call MPI_Finalize(ierr)
stop
endif

ia = 1
ib = ia + m/nprocs ! n
ic = ib + n ! l/nprocs
iwk = ic + m/nprocs ! l
iend = iwk + n ! l/nprocs
if ( iend .gt. nbuffer+1 ) then
if (myrank.eq.0) print *, 'Insufficient buffer size!'
call MPI_Finalize(ierr)
stop
endif

call init( m, n, l, myrank, nprocs, buf(ia), buf(ib), buf(ic)
& , buf2(ia),buf2(ib),buf2(ic) )

time_start = MPI_Wtime()
call matmul( m, n, l, myrank, nprocs, buf2(ia), buf2(ib), buf2(ic)
& , buf2(iwk) )
time_end = MPI_Wtime()

call check( m, n, l, myrank, nprocs, buf2(ia), buf2(ib), buf2(ic))

if ( myrank .eq. 0 ) then
print *, 'time = ', time_end-time_start
print *, 'mflops = ', m*(n+n-1.0)*l/(time_end-time_start)*1d-6
endif

print*,'ok'
call MPI_Finalize(ierr)
stop
end

!------------------------------------------------------------------

subroutine init(m, n, l, myrank, nprocs, a, b, c, a2, b2,c2)
implicit double precision (a-h, o-z)
include 'mpif.h'
dimension a(m/nprocs, n), b(n, l/nprocs), c(m/nprocs, l)
dimension a2(n, m/nprocs), b2(l/nprocs, n), c2(l,m/nprocs)

mloc = m/nprocs
lloc = l/nprocs

! Init. a, b
do j=1, n
do i=1, mloc
a(i,j) = i+myrank*mloc
enddo
enddo

do j=1, lloc
do i=1, n
b(i,j) = j+myrank*lloc
enddo
enddo

! Tranpose a, b -> a2, b2
do j=1, mloc
do i=1,n
a2(i,j) = a(j,i)
enddo
enddo

do j=1, n
do i=1,lloc
b2(i,j) = b(j,i)
enddo
enddo

return
end

!------------------------------------------------------------------

subroutine check(m, n, l, myrank, nprocs, a, b, c)
implicit double precision (a-h, o-z)
include 'mpif.h'
dimension a(m/nprocs, n), b(n, l/nprocs), c(m/nprocs, l)
!dimension a(n,m/nprocs), b(l/nprocs,n), c(l,m/nprocs)
integer local_code, code

mloc = m/nprocs
lloc = l/nprocs

!Check the results
local_code = 0
do i=1, l
do j=1, mloc
if ( abs(c(i,j) - n*dble(j+myrank*lloc)*i) .gt. 1d-10 ) then
local_code = 1
print*,'local_code=',local_code
goto 10
endif
enddo
enddo

10 call MPI_Rece( local_code, code, 1, MPI_INTEGER, MPI_SUM, 0,
& MPI_COMM_WORLD, ierr)
!
if ( myrank .eq. 0 ) then
print *, 'code = ', code
endif
!
return
end

* !Parallel multiplication of matrices using MPI_Isend/MPI_Irecv
*
subroutine matmul(m, n, l, myrank, nprocs, a, b, c, work)
implicit double precision (a-h, o-z)
include 'mpif.h'
dimension a(n,m/nprocs), b(l/nprocs,n), c(l/nprocs,m),
& work(n,m/nprocs)
integer src, dest, tag
integer status(MPI_STATUS_SIZE, 2), request(2)
*
mloc = m/nprocs
lloc = l/nprocs
*
dest = mod( myrank-1+nprocs, nprocs )
src = mod( myrank+1, nprocs )
*
jpos=myrank*mloc
print*,'myrank=',myrank
c print*,'dest=',dest,'src=',src
c print*,'jpos=',jpos,'tag=',tag

*
do ip=1, nprocs - 1
tag = 10000 + ip
*
call MPI_Isend( a, n*mloc, MPI_DOUBLE_PRECISION, dest, tag,
& MPI_COMM_WORLD, request(1), ierr )
call MPI_Irecv( work, n*mloc, MPI_DOUBLE_PRECISION, src, tag,
& MPI_COMM_WORLD, request(2), ierr )
*
do i=1, lloc
do j=1, mloc
sum=0.d0
do k=1, n
sum = sum + b(i,k) * a(k,j)
enddo
c(i, j+jpos) = sum
enddo
enddo
*
call MPI_Waitall(2, request, status, ierr)
*
* 拷贝 work -> b (可以通过在计算/通信中交替使用 b/work 来避该免操作)
do i=1, n
do j=1, mloc
a(i,j) = work(i,j)
enddo
enddo
*
jpos = jpos + mloc
if ( jpos .ge. m ) jpos = 0
*
enddo
*
do i=1, lloc
do j=1, mloc
sum=0.d0
do k=1, n
sum = sum + b(i,k) * a(k,j)
enddo
c(i, j+jpos) = sum
enddo
enddo
*
print*,'c(1,mloc)=',c(1,mloc)
print*,'c(1,2)=', c(1,2)
print*,'c(2,1)=', c(2,1)
print*,'c(lloc,1)=',c(lloc,1)
return
end

㈢ 在Linux进行C语言编程的时候,程序里使用了mpi或者openmp或者都使用了该怎么进行编译执行谢谢

mpi或者openmp
这个,你指的是库?
如果是的话,编译时,加上链接库的编译选项就可以。
比如 gcc -hello.c -o hello -lm -lxml -L/usr/local/lib -lts
-lm 链接了math库
-lxml链接了xml库
-L/usr/local/lib -lts 链接了ts库,ts库存在目录/usr/local/lib中

㈣ 急求一关于求解大规模稀疏矩阵的MPI并行计算程序(基于C语言)

这个大哥牛逼啊!!!!杨老板要看到了肯定怨念重重啊!!!

㈤ 我们来讲解以下如何才能编写并行程序,以及如何编译运行

我们下面以C 语言为例。
具体语法规则可参看《高性能计算并行编程技术-MPI 并行程序设计》一书。
mpicc -o outfilename cpi.c
其中outfilename 为编译后的输出文件,cpi.c 为源代码.
可将cpi.c 下载后上传的自己目录下编译.
例如:mpicc -o cpi cpi.c
如没有安装OpenPBS 则:
mpirun -np 4 cpi
否则:(一般安装了)
之后需写一作业提交脚本.例如:submit 内容如下:
#PBS -l nodes=nodes number
#PBS -N jobname#PBS -j oecd /home/xmin/Project
/usr/local/bin/mpiexec cpi
其中 #PBS -l nodes=nodes number 为指定几个节点计算.如: nodes=4
#PBS -N jobname 为用户命名的提交作业名称.如: #PBS -N xmin
#PBS -j oe 为结果和错误输出同文件.如无此项则分别在两个文件中.
cd /home/xmin/Project 编译后的输出文件所在路径(从根目录开始).
/usr/local/bin/mpiexec cpi 为mpiexec 所在路径.
下面是完整例子:
#PBS -l nodes=4
#PBS -N xmin#PBS -j oecd /home/xmin/Project
/usr/local/bin/mpiexec cpi
提交脚本如下:
qsub submit得到如下:3565.isc.math.nankai.e.cn
此为你的作业编号.
这样你就可得到类似xmin.o2666 的文件,打开即可看到结果.
你还可以查询作业提交情况.命令如下:qstat

㈥ 求解并行题目: 以下是一段用MPI 实现的并行程序代码,用来并行求一组数的和。 #include <mpi.h> #include

#include <mpi.h>

#include <stdio.h>

#include <math.h>

#define SIZE 10

void main(int argc, char *argv)

{

int myid, numprocs;

int data[SIZE], i, x, low, high, myresult, result;

char fn[255];

char *fp;

MPI_Init(&argc,&argv);

MPI_Comm_size(MPI_COMM_WORLD,&numprocs);

MPI_Comm_rank(MPI_COMM_WORLD,&myid);

if (myid == 0) { /* Open input file and initialize data */

strcpy(fn,getenv("HOME"));

strcat(fn,"/data");

if ((fp = fopen(fn,"r"答斗)) == NULL) {

printf("Can’t open the input file: %s\n\n", fn);

exit(1);

}

for(i = 0; i <消陆 SIZE; i++) fscanf(fp,"%d", &data[i]);

}

/* broadcast data */

MPI_Bcast(data, SIZE, MPI_INT, 0, MPI_COMM_WORLD);

/* Add my portion Of data */清桥磨

x = SIZE/numprocs;

low = myid * x;

high = low + x;

if(myid == numprocs - 1) high = SIZE;

myresult = 0;

for(i = low; i < high; i++)

myresult += data[i];

/* Compute global sum */

MPI_Rece(&myresult, &result, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);

if (myid == 0) printf("The sum is %d.\n", result);

MPI_Finalize();

}

㈦ C语言中的MPI编程和多线程有什么区别,MPI编程中针对的是一台电脑多核还是多台电脑谢谢!

MPI(MPI是一个标准,有不同的具体实现,比如MPICH等)是多主机联网协作进行并行计算的工具,当然也可以用于单主机上多核/多CPU的并行计算,不过效率低。它能协调多台主机间的并行计算,因此并行规模上的可伸缩性很强,能在从个人电脑到世界TOP10的超级计算机上使用。缺点是使用进程间通信的方式协调并行计算,这导致并行效率较低、内存开销大、不直观、编程麻烦。OpenMP是针对单主机上多核/多CPU并行计算而设计的工具,换句话说,OpenMP更适合单台计算机共享内存结构上的并行计算。由于使用线程间共享内存的方式协调并行计算,它在多核/多CPU结构上的效率很高、内存开销小、编程语句简洁直观,因此编程容易、编译器实现也容易(现在最新版的C、C++、Fortran编译器基本上都内置OpenMP支持)。不过OpenMP最大的缺点是只能在单台主机上工作,不能用于多台主机间的并行计算!如果要多主机联网使用OpenMP(比如在超级计算机上),那必须有额外的工具帮助,比如MPI+OpenMP混合编程。或者是将多主机虚拟成一个共享内存环境(Intel有这样的平台),但这么做效率还不如混合编程,唯一的好处是编程人员可以不必额外学习MPI编程。

热点内容
c语言发短信 发布:2024-05-18 13:23:08 浏览:833
vb数据库程序 发布:2024-05-18 13:01:57 浏览:111
新建文件夹2免费手机 发布:2024-05-18 12:56:13 浏览:365
自己在家搭建服务器有水冷散热吗 发布:2024-05-18 12:47:27 浏览:649
旧版的安卓手机怎么使用微信 发布:2024-05-18 12:46:36 浏览:467
我的世界服务器开多久 发布:2024-05-18 12:45:32 浏览:593
vba获取网页表格数据库数据库数据库 发布:2024-05-18 12:23:24 浏览:700
腾讯服务器为什么卡顿 发布:2024-05-18 12:02:12 浏览:306
如何知道密码锁有没有nfc 发布:2024-05-18 11:58:09 浏览:962
单片机c语言模块化编程 发布:2024-05-18 11:53:16 浏览:645