我有一个需要与openMP进行并行的C代码。代码本身可以串行运行,但不是在并行时运行。代码正在用PBS运行,我已经包含了批处理脚本。
代码有两个并行区域,都在一个时间循环中,在结束时变为串行打印输出文件。理想情况下,每个时间步长有一个输出。
系列我每隔一段时间输出一个文件,但并行输出第一个文件并继续无限期地运行(包括错误文件,自制和系统错误)。
.#pragma omp parallel for default(none) private (dudx2, dudy2, dudz2, du, /*I_gap, I_gap2,*/ Ii, x, y, z) shared (V, Vnew, /*v_fibro,*/ hh) schedule(static)
for (z=1;z<Z;z++) {
for (y=1;y<Y;y++)
for (x=1;x<X;x++)
if (hh[x][y][z] > 0) {
dudx2 = (V[x - 1][y][z] + V[x + 1][y][z] - 2 * V[x][y][z]) ;
dudy2 = (V[x][y - 1][z] + V[x][y + 1][z] - 2 * V[x][y][z]) ;
dudz2 = (V[x][y][z - 1] + V[x][y][z + 1] - 2 * V[x][y][z]);
du = (D/(dx*dx))*((dudx2) + (dudy2) + (dudz2)) ;
Ii = MYO(x,y,z); //calls function with multiple multi-dimen' arrays
Vnew[x][y][z] = V[x][y][z] + dt * (du - Ii );
}
}
.#pragma omp parallel for default(none) shared (V, Vnew, hh) private (x, y, z) schedule(static)
for (z=0;z<=Z;z++) {
for (y=0;y<=Y;y++)
for (x=0;x<=X;x++){
if (hh[x][y][z] > 0)
V[x][y][z]=Vnew[x][y][z];
}
}
sprintf(str2,"V%d.vtk",tab);
fprintf(outp,"%s\n",str2);
userfile=fopen(str2,"wt");
if(userfile==NULL) fprintf(outp,"Could not open%s\n.",str2);
tab++;
fprintf(userfile,"vtk header\n");
for (z=0;z<Z;z++){
for (y=0;y<Y;y++){
for (x=0;x<X;x++){
fprintf(userfile,"%g ",Vnew[x][y][z]);
}
- 多维阵列为200x200x200,其中有20多个无法实际减少(代表3d组织中的生物细胞特性)
这导致我们调查内存错误的可能性。所以我们更改了批处理脚本以允许每个处理器8gb
- 代码包含和omp_set_num_threads(64),编译行是;
gcc -lm -lgomp -fopenmp -03 filename.c -o test ("-mcmodel=medium" has been trialed)
- 批处理脚本是
mppwidth和aprun不运行
.#!/bin/bash
.#PBS -l nodes=1:ppn=64
.#PBS -l mem=512G
.#PBS -M email adress@gmail.com
.#PBS -l walltime=20:00:00
.#PBS -N test
.#PBS -o ./
.#PBS -e ./
.#Modules!
. /etc/profile.d/modules.sh
module purge
.#(Intel compilers)
.# source /opt/intel/composer_xe_2011_sp1.7.256/bin/compilervars.sh intel64
module load intel/composerxe/13.0.0
cd $PBS_O_WORKDIR
export OMP_NUM_THREADS=64
./test
提前致谢,并对糟糕的拼写语法和格式等道歉。
答案 0 :(得分:0)
这是一个简单的例子:
#include <stdio.h>
#include <math.h>
#include <sys/time.h>
#define OMP_NUM_THREADS 4
#define X 50
#define Y 50
#define Z 50
double dtime(){
double t;
struct timeval tv;
gettimeofday(&tv, NULL);
t = tv.tv_sec + ((double)tv.tv_usec)/1e6;
return t;
}
int main(int argv, char **argc){
double V[X][Y][Z];
double Vnew[X][Y][Z];
int z;
for (int z=0;z<Z;z++)
for (int y=0;y<Y;y++)
for (int x=0;x<X;x++)
V[x][y][z] = 3.*x+2.*y+z;
double t0 = dtime();
#pragma omp parallel for shared(V, Vnew)
for(z=1;z<Z;z++)
for(int y=1;y<Y;y++)
for(int x=1;x<X;x++)
Vnew[x][y][z] = sin(V[x][y][z])*cos(V[x][y][z])+log(V[x][y][z]);
printf("time: %g\n", dtime() - t0);
FILE *userfile=fopen("out" ,"w");
fprintf(userfile,"vtk header\n");
for (z=0;z<Z;z++)
for (int y=0;y<Y;y++)
for (int x=0;x<X;x++)
fprintf(userfile,"%g ",Vnew[x][y][z]);
}
编译:
gcc -std=gnu99 -fopenmp -lm 1.c
在我的机器上运行(4核)之后,它会给出:
time: 0.0224061
当我评论#pragma omp
时,我得到:
time: 0.059217
答案 1 :(得分:0)
我们已经取得了进展,使得并行工作在openmp中,但仅适用于小型文件(将运行阵列20x20x20,50x50x50但不适用于100 ......),20x20x20速度较慢,50x50x50速度明显更快。但我们需要它在长跑中与更大的武器合作
对于较大的文件,它为第一次循环写入第一个outfile并且无法写入其余文件(使用较小的数组大小观察),因为它适用于较小的数组大小,我们想知道这是否可能是内存问题?