0

openMP での並列化が必要な C コードがあります。コード自体はシリアルに正常に実行されますが、並列化された場合は実行されません。コードは PBS で実行されており、バッチ スクリプトが含まれています。

コードには 2 つの麻痺領域があり、どちらもタイム ループ内にあり、最後に連続して出力ファイルを出力します。理想的には、時間ステップごとに 1 つの出力を持つことです。

タイムステップごとにシリアルにファイルを出力しますが、並行して最初のファイルを出力し、何も出力せずに無期限に実行し続けます(エラーファイル、自作エラーとシステムエラーの両方を含む)。

コード

.#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 組織の生物学的細胞特性を表します)。

これにより、メモリ エラーの可能性を調査することになりました。そのため、バッチ スクリプトを変更して、プロセッサあたり 8 GB を許可しました。

- コードには 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

事前に感謝し、ひどいスペルの文法や書式設定などについてお詫び申し上げます.

4

2 に答える 2

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
于 2013-02-08T16:32:51.890 に答える
0

私たちは、openmp で並列化を機能させるための進歩を遂げましたが、小さなファイルに対してのみ (配列 20x20x20、50x50x50 では実行されますが、100 では実行されません...)、20x20x20 では遅くなり、50x50x50 では大幅に速くなりました。しかし、長期的にははるかに大きなアラーで機能する必要があります

大きなファイルの場合、最初のループで最初の出力ファイルを書き込み、残りの書き込みに失敗します (小さな配列サイズで観察されます)。小さな配列サイズで動作するため、これがメモリの問題ではないかと考えていました。

于 2013-02-12T17:13:51.677 に答える