2012-01-25 8 views

答えて

2

OpenMP仕様では、変数がスタックまたはヒープに割り当てられるかどうかは指定されていません(ヒープ上にある場合、共有アレイ内にある場合、またはスレッドごとに1つのオブジェクトが割り当てられている場合)。一般的に私は、プライベート変数がスタックに割り当てられていると仮定します(そうしなければならない理由はなく、一般的により効率的です)。 the manualによると、libgomp(gccで使用されている実装)で使われている動作ですが、他の実装についてのヒントはありません。

+0

私は思っただろう、それは意味をなさない。ありがとう。 –

0

OpenMPはプライベート変数の割り当てについて何も指定しません。
ヒープとスタックの2つのオプションがあります。
各スレッドが命令の数を減らしていると考えると、マスタスレッドは以下のようなプライベート変数を割り当てるのが理にかなっています。

コード:

1: set_threads(n) 
2: #pragma omp parallel private(var) 
3: { 
4: var = ... 
5:} 

マシンコード:
LINE2:var_ptr =新しい変数[n]は
LINE4:var_ptr [get_thread_id()] = ...

しかし、上記のコードは、異なるスレッドのプライベート変数の間で多くの偽の共有を引き起こします。だから、私は、コンパイラが各スレッドのスタックにそれらを割り当てることは理にかなっていると思います。

+0

これに関する参考情報はありますか?仕様はそれを指定しているようではなく、単にスタックに割り当てるのと比べて非効率的に見えます。さらに、[this](http://gcc.gnu.org/onlinedocs/libgomp.pdf)によると、少なくともlibgompはそれをそうしていません。 'private'データの割り当てを避けるためには、どのような指示があるのでしょうか? – Grizzly

+0

共有!=プライベートとあなたが示した擬似コードは、このコードがほとんどの(=キャッシュ一貫性のある)CPUアーキテクチャ上で主要なパフォーマンスを殺す偽の共有を引き起こすので、間違いなく完全に間違っています。 –

+0

@above ..オハイオ州のおい...私はあなたのポイントを今得た。問題は、実行された命令の数を最小限に抑えるという開発者の考えから考えていたことです。ヒープにプライベート変数を割り当てると、プライベート変数に対応するためにスタック・ポインタを減らすすべてのスレッドと比較して、マスター・スレッドだけがmallocを実行するようになります。しかし、これは確かに長期的には私的変数間の誤った分担を誘発するだろう。それを指摘してくれてありがとう。 PS:編集したポストを見てください。 –

関連する問題