2

nvidia GPU で OpenMP オフロードを試しており、C++ で配列計算を実行しようとしています。

OpenMP で計算をオフロードするのは初めてなので、今のところ私の出力は望ましくありません。誰かが私を正しい方向に向けることができれば幸いです。

コードスニペット:

#include <omp.h>
#include <iostream>

using namespace std;

int main(){

        int totalSum, ompSum;
        const int N = 1000;
        int array[N];
        for (int i=0; i<N; i++){
                array[i]=i;
        }
        #pragma omp target
        {
                #pragma omp parallal private(ompSum) shared(totalSum)
                {
                        ompSum=0;
                        #pragma omp parallel for
                        for (int i=0; i<N; i++){
                                ompSum += array[i];
                        }

                        #pragma omp critical
                        totalSum += ompSum;

                }


                printf ( "Caculated sum should be %d but is %d\n", N*(N-1)/2, totalSum );
        }

        return 0;


}

今のところ、合計は499500になるはずですが、私のマシンは負の非常に大きな数値を出力しています。

4

2 に答える 2

4

OpenMP コンストラクターにいくつかのタイプミスがあります。つまり、次のとおりです。

  1. #pragma omp parallal -> #pragma omp parallel;
  2. #pragma omp parallel for -> #pragma omp for

parallel2.については、すでに並列領域内にいるため、必要ありません。

次のことを試してください。

using namespace std;

int main(){

        int totalSum = 0, ompSum = 0;
        const int N = 1000;
        int array[N];
        for (int i=0; i<N; i++){
                array[i]=i;
        }
        #pragma omp target
        {
                #pragma omp parallel private(ompSum) shared(totalSum)
                {
                        ompSum=0;
                        #pragma omp for
                        for (int i=0; i<N; i++){
                                ompSum += array[i];
                        }

                        #pragma omp critical
                        totalSum += ompSum;
                }


                printf ( "Caculated sum should be %d but is %d\n", N*(N-1)/2, totalSum );
        }

        return 0;
}
于 2021-08-05T10:39:11.220 に答える