在CPU和你的应用程序之间,隔着的是 *** 作系统(Windows或Linux/Unix等),也就是说程序的并行与否都是基于 *** 作系统的。 现代的 *** 作系统, 比如Windows都是多任务多线程的, 因此你的程序也可以具有这个能力。 *** 作系统对进程作时间片选或分割(time slice),每个进程其实只能有很短的时间占据着CPU时间, 然后其进程和CPU寄存器信息被保存并被切换给别的进程(content switching)。 就如同虚拟空间一样, 每个程序都“认为”自己独占CPU和内存, 这也是“隔离”的概念。 如果你的物理CPU多, 当然有助于这一切换,如果你只有一个CPU,这个过程也在进行着,当然比较慢。
#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 = 0i <SIZEi++) 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 = lowi <highi++)
myresult += data[i]
/* Compute global sum */
MPI_Reduce(&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 并行程序设计》一书。
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.edu.cn
此为你的作业编号.
这样你就可得到类似xmin.o2666 的文件,打开即可看到结果.
你还可以查询作业提交情况.命令如下:qstat
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)