2

メイクファイルのコンパイル/作成に関しては、私は最高ではありません。

GSL と OpenMP の両方を使用するプログラムを作成しようとしています。

GSL と OpenMP を別々に使用しても問題はありませんが、両方を使用すると問題が発生します。たとえば、GSL プログラム http://www.gnu.org/software/gsl/manual/html_node/An-Example-Program.html をコンパイルでき ます

$gcc -c Bessel.c
$gcc Bessel.o -lgsl -lgslcblas -lm
$./a.out

そしてそれは動作します。

ここで見つけた OpenMP を使用するプログラムをコンパイルすることもできました: OpenMP で内部ループごとにスレッドを開始する

この場合、私は入力しました

$gcc -fopenmp test_omp.c
$./a.out

そして、私が欲しかったものを手に入れました(私が持っている4つのスレッドすべてが使用されました)。

ただし、単純に 2 つのコードを組み合わせたプログラムを作成すると、

#include <stdio.h>
#include <gsl/gsl_sf_bessel.h>
#include <omp.h> 

 int
 main (void)
 {
   double x = 5.0;
   double y = gsl_sf_bessel_J0 (x);
   printf ("J0(%g) = %.18e\n", x, y);


int dimension = 4;
int i = 0;
int j = 0;
#pragma omp parallel private(i, j)
for (i =0; i < dimension; i++)
    for (j = 0; j < dimension; j++)
        printf("i=%d, jjj=%d, thread = %d\n", i, j, omp_get_thread_num());

return 0;

 }

次に、タイピングにコンパイルしようとします

$gcc -c Bessel_omp_test.c
$gcc Bessel_omp_test.o -fopenmp -lgsl -lgslcblas -lm
$./a.out

GSL 部分は機能します (ベッセル関数が計算されます) が、OpenMP 部分には 1 つのスレッドしか使用されません。ここで何が問題なのかわかりません...

4

2 に答える 2

3

forOpenMP パーツにワークシェアリング ディレクティブがありません。そのはず:

// Just in case GSL modifies the number of threads
omp_set_num_threads(omp_get_max_threads());
omp_set_dynamic(0);

#pragma omp parallel for private(i, j)
for (i =0; i < dimension; i++)
    for (j = 0; j < dimension; j++)
        printf("i=%d, jjj=%d, thread = %d\n", i, j, omp_get_thread_num());

編集:以下のコメントでの議論を要約すると、OP-fopenmpはコンパイル段階で提供できませんでした。これにより、GCC が OpenMP ディレクティブを認識できなくなり、並列コードが生成されませんでした。

于 2012-05-09T17:34:13.843 に答える
0

私見、変数を共有として宣言するのは正しくありませij。それらを非公開として宣言してみてください。そうしないと、各スレッドが同じ結果jになりj++、スレッド間で競合状態が発生します。

于 2012-05-09T16:28:12.903 に答える