2

複数の.cファイルと複数の.hファイルで構成されるCプログラムがあります。main関数に1つの#pragma omp parallelディレクティブ(すべてのスレッドが1回だけ作成されるようにする)を設定してから#pragma omp for、他のファイルと同様に他のOpenMP処理を実行したいと思います。

しかし、私はこれを行うことができないようです。private()メインファイルをコンパイルすると、ディレクティブのandshared()ビットに記載されている変数の一部が#pragma omp parallel存在しない(他のファイルにあるため、そのファイルには存在しません)と文句を言います。#pragma omp forを囲むことなく、私が持っていると文句を言うファイル#pragma omp parallel

コードはファイル間でうまく分割されているので、すべてを1つのファイルに戻す必要はありません。これを回避する方法はありますか?

4

2 に答える 2

3

あなたは間違いなくすることができます:

external.c:

#include <stdio.h>
#include <stdlib.h>
#include <omp.h>

void inner(int n);

int main(int argc, char **argv) {
    int n=15;

    #pragma omp parallel shared(n) num_threads(4)
    {
        inner(n);
    }

    return 0;
}

inner.c:

#include <omp.h>
#include <stdio.h>

void inner(int n) {
    int thread = omp_get_thread_num();
    printf("%3d: got %d\n", thread, n);

    #pragma omp for
    for  (int i=0;i<n;i++) {
        int newthread=omp_get_thread_num();
        printf("%3d: doing iter %d.\n",newthread,i);
    }
}

と実行中:

$ make
gcc -fopenmp -std=c99   -c -o outer.o outer.c
gcc -fopenmp -std=c99   -c -o inner.o inner.c
gcc -o nested outer.o inner.o -fopenmp -std=c99 -lgomp    
$ ./nested 
  3: got 15
  3: doing iter 12.
  3: doing iter 13.
  3: doing iter 14.
  0: got 15
  0: doing iter 0.
  0: doing iter 1.
  0: doing iter 2.
  0: doing iter 3.
  1: got 15
  1: doing iter 4.
  1: doing iter 5.
  1: doing iter 6.
  1: doing iter 7.
  2: got 15
  2: doing iter 8.
  2: doing iter 9.
  2: doing iter 10.
  2: doing iter 11.

ただし、いいえ、あるルーチンの変数の共有属性を別のルーチンから設定することはできません。変数はスコープ内にありません。あなたは彼らの価値を設定することができる以上に彼らの共有を設定することはできません。

(たとえば)innerを起動すると、そこにあるものはすべてプライベートになります。共有されているものはすべて共有として渡す必要があります。

「そこにあるすべてのものはプライベート」についてのそのビットを明確にするために:上記は何も違いはありません

    int n=15;

    #pragma omp parallel shared(n) num_threads(4)
    {
        int thread = omp_get_thread_num();
        printf("%3d: got %d\n", thread, n);

        #pragma omp for
        for  (int i=0;i<n;i++) {
            int newthread=omp_get_thread_num();
            printf("%3d: doing iter %d.\n",newthread,i);
        }
    }

thread、i、およびnewthreadは、関数内かどうかに関係なく、並列ブロック内で定義されているため、これらはすべて必然的にプライベートです。

于 2011-04-13T11:32:44.560 に答える
1

「externXY」を試して、他のファイルで変数を認識させましたか?

問題の変数を宣言するすべてのファイルに共通のヘッダーを使用できませんか?

それらはローカル変数ですか(それでは、とにかくこれを行うことはできません)?

于 2011-04-13T09:57:27.867 に答える