2

私は、並列計算とオプションとトリックの検索が初めてです。

私の現在の問題は、タイプ B = AX の 2 32 個の独立した線形方程式を見つけることです。A[8x8]、B[8x1]、および X[8x1] の寸法。A は密行列です。

私は CLAPACK - zgelss 関数を Intel コア 7i プロセッサ、4 コア、8 スレッド、および Mac マシンで順番に使用しています。

さらに、私の行列サイズは、内部最適化を使用するのに十分小さいようです。

このループに並列処理を適用したい:

for (n = 0; n < 2^32; n++)
{...}

それを行うための私のオプションは何ですか?

数人が OpenMP の使用を提案しましたが、OpenMP について読んだ後、プリコンパイルされたコードの部分に OpenMP ディレクティブを適用できないことがわかりました。

そうすれば動作しますが、プリコンパイルされた関数内の一時変数をプライベート化できないため、安全ではない可能性があります。{正しい/間違っている/その他をコメントしてください}

可能であれば、どのようにすればよいかお聞きしたいです。いくつかのトリック....何でも...

4

2 に答える 2

1

呼び出したいライブラリがスレッドセーフであることがわかっていない限り、呼び出しをスレッド化することはできません。ただし、Lapack 3.3 の時点では、すべてのlapack 呼び出しはスレッドセーフです(ただし、lapack ルーチンを強化するために別の基本的な BLAS パッケージを使用している場合は、それらもスレッドセーフであることを確認する必要があります)。Clapack は、lapack 呼び出しのラッパーの薄い層です。それらはスレッドセーフであるべきです[編集:以下のjannebが指摘しているように、これは間違っています。Clapack は古いバージョンの Lapack を直接自動 C に変換したものなので、スレッドセーフではない可能性が高い] ですが、ドキュメントでそれについて何も確認できない場合は、(少し手間がかかりますが) を呼び出すのは簡単です。 Fortran ルーチンを直接。

別の方法は、スレッドではなく、異なるプロセスでさまざまな関数呼び出しを行うことです。もう少し手間がかかりますが、簡単です。標準的な方法は MPI を使用することです。これには特定の利点がありますが、この場合はやり過ぎかもしれません。

于 2011-08-23T15:12:55.580 に答える
0

Jonathan と janneb から提供された情報の助けを借りて、openMP を使用して関数 zgelss を正常に並列化することができました。

LAPACK 3.3 を使用し、独自の FORTRAN から C へのインターフェイスを作成しました。

于 2011-08-29T08:58:55.433 に答える