13

Linuxマシンでgccを使用してopenMPでCで作業しています。openmp の並列 for ループでは、静的に割り当てられた配列をプライベートとして宣言できます。コードフラグメントを考えてみましょう:

int a[10];
#pragma omp parallel for shared(none) firstprivate(a)
for(i=0;i<4;i++){

そして、すべてが期待どおりに機能します。しかし、代わりに動的に割り当てると、

int * a = (int *) malloc(10*sizeof(int));
#pragma omp parallel for shared(none) firstprivate(a)

a の値 (少なくとも a[1...9]) は保護されていませんが、共有されているかのように機能します。これは、pragma コマンドでは、プライベートにする必要がある配列 a の大きさを omp に伝えるものがないため、理解できます。この情報をopenmpに渡すにはどうすればよいですか? 動的に割り当てられた配列全体をプライベートとして宣言するにはどうすればよいですか?

4

2 に答える 2

9

ポインター aがプライベートである、つまり各スレッドで複製されることを OpenMP に伝えました。配列は単なる任意のデータaポイントであり、OpenMP はそれを複製しません (おそらく、複製された配列の割り当てと割り当て解除が必要になるためです)。

于 2011-02-17T07:12:18.657 に答える