私はMATLABでmexコードを記述して操作を行っています(操作はc ++のライブラリを使用しているため)。mexコードには、異なる引数値を使用してループ内で繰り返し呼び出される関数があり、各関数呼び出しが独立しているセクションがあります(つまり、1つの呼び出しの計算は前の呼び出しに依存しません)。したがって、これを高速化するために、複数のスレッドを作成するマルチスレッドコードを作成しました。正確なスレッド数はループの反復回数に等しく、この例ではこの値は10です。各スレッドはループ内の関数を個別の値として計算します。引数、スレッドが戻って結合し、さらに計算が行われ、結果が返されます。理論的には、これらすべてが私に良いスピードアップを与えるはずですが、マルチスレッドコードは通常のシングルスレッドコードよりもはるかに遅いことがわかります!! 私は非常に強力な24コアのマシンにアクセスできるので、各スレッドが別々のコアでスケジュールされることを期待していたので、これは完全に困惑しています。これにつながるものについて何かアイデアはありますか?これにつながるコードの一般的な問題/エラーはありますか?
どんな助けでも大歓迎です。
編集:ここの人々によって提案されたソリューションで提起された多くの疑問に答えるために、私のコードに関するいくつかの情報を共有したいと思います:1.各関数呼び出しは数分かかるので、スレッドの同期と生成はここでオーバーヘッドになるべきではありません(この場合の緩和状況はありますか、それに関する情報は本当に役に立ちます!)
各スレッドは共通のデータ構造、配列、行列にアクセスしますが、これらの値はまったく上書きされません。変数へのすべての書き込みは、スレッドに対してローカルな変数、ポインター、配列などに対して行われます。だから、私はここで多くのキャッシュミスがあるべきではないと推測していますか?
また、共通のメモリ位置にスレッドが書き込まないため、コードにミューテックスセクションはありません。すべての書き込みは、スレッドに対してローカルなメモリ位置に行われます。
私はまだ私のマルチスレッド実装が機能していない理由を理解しようとしています:(だから、どんなポインタ/情報も本当に役に立ちます!
ありがとう!!