2017-07-07 2 views
0

私のコードのどこかで並列領域にないcblas_drotを呼びたいと思います。それから、この呼び出しの実行時間は基本的にシングルスレッドモードと24スレッドで同じであると私は混乱します。関数呼び出しの前にmkl_set_num_threads()でスレッド数を設定しました。誰でも何が起こったのか考えていますか?どうもありがとう。MKL:スレッディングの効果を確認できません

cpuは2 * Xeon E5 2620v3で、OSはUnbuntu 16.04.2です。

+0

linuxディストリビューションで提供されるBLASライブラリとLAPACKライ​​ブラリはシングルスレッドです。 Intel MKLやAMDなどの独自のパフォーマンスライブラリビルドには、適切な関数のOpenMPスレッドが組み込まれている場合がありますが、ライブラリのすべての関数ではありません。 mkl_set_num_threadsのデフォルト値は物理コアの数です。 – tim18

+0

MKL?rot関数はスレッド化されていますが、24個の物理コアとスケーリングに最適な問題サイズがあっても、24個のスレッドに拡張される可能性は低いようです。 ark.intel.comは、CPUあたり6コアを持つことを示しているため、12スレッドを超えるスレッドを設定すると生産性が低下するようです。 – tim18

答えて

0

おそらく、あなたはメモリ帯域幅を飽和させています。その関数の計算強度は非常に低く、パフォーマンスは主にメモリアクセスのタイミングによって決まります。実際、スケーラビリティの結果はincXとincYの増分に大きく依存します。 INCX/Yが異なる場合スピードアップが8つのスレッド(及び依然として16のスレッドで)までまともであることを示すこと

N threads | time for incX=incY=1 | time for incX=incY=32 
1   | 0.026271    | 1.243775 
2   | 0.020599    | 0.555945 
4   | 0.017871    | 0.301370 
8   | 0.021367    | 0.152756 
16  | 0.021729    | 0.175500 

:= 10000000 Nを仮定すると、私は(CPU E5-2670)ことを見出しました1. incX/Y = 1の場合、非常に最適化されたバージョンの関数(AVX関数を大量に使用する)は、使用可能なメモリ帯域幅の大部分を使用してOpenMP並列化の結果を非常に悪くします。私はちょうど起こっていることを推測しています:それを確認するには、低レベルのプロファイラの使用を検討するかもしれません。

+0

私はincXとincYの意味を誤解しているようですが、これは私のプログラムでは0に設定されています。実際incX/Y = 1のときはパフォーマンスが望ましいと判断されます。しかし、私はまだincX/Yの正確な意味が何か不思議ですか?それはベクトルレジスタを埋めることと関係があるように見えますが、私は利用可能な材料に手がかりを見つけることができません。 –

+0

incX/Yは、演算子(この場合は回転)に応じて変更する必要がある配列の連続する項目間のストライドです。通常はincX/Y = 1ですが、大きな値は、たとえば行列を表す配列の列で作業したい場合などに便利です。明確にするために、基本的なnetlibの実装を確認してください:http://www.netlib.org/lapack/explore-3.1.1-html/drot.f.html – Franz

関連する問題