C ++ Linuxマルチスレッドのボトルネック。 strace -f: `[pid 2646] mprotect(0x7ffe7c030000,4096、PROT_READ | PROT_WRITE)= 0`

私は無差別な最適化を行うparrallelized C ++プログラムを持っています。何らかの理由で、コアあたりのリターンが6コアまで減少します。その時点で、さらなるコアが速度を増やす壁に当たったのです。これは、8または16コアマシンで実行すると一貫しています。

strace -f ./progname を実行すると、プログラムのマルチスレッドセクションで特に発生する次のような問題が発生します。 [pid 2646] mprotect(0x7ffe7c030000、4096、PROT_READ | PROT_WRITE)= 0

and a few of these that occur one after the other: [pid 2645] mprotect(0x7ffe78030000, 4096, PROT_READ|PROT_WRITE -- [pid 2646] <... mprotect resumed> ) = 0

彼らはいつも同じ pid からではありません。

私がコアの数を減らすと、私は上記のメッセージの数を減らし、2または3のコアでは何も得られません。

私が推測できるのは、膨大な量のベクトル割り当てと各スレッドで行われるアクセスに関係しているかもしれないということだけです。私はそれが関連している場合、他のメモリ管理ライブラリを使用していません。

1

1 答え

私は無差別な最適化を行うparrallelized C ++プログラムを持っています。   なんらかの理由で、コア当たりのリターンが〜6コアまで減少します。   どのポイントに私はさらにコアが〜ない速度を追加する壁に当たった。これは   8または16コアマシンで実行すると一貫性があります。

あなたはアルゴリズムを記述できますか?多くの計算アルゴリズムはメモリに束縛されています。

oprofile perf 、または可能でない場合は gprof でアプリケーションをプロファイリングしてみてください。

私が推測できるのは、大規模な   ベクトルの割り当て量とアクセス数   糸。私は他のメモリ管理ライブラリを使用していない   関連性があります。

TLBの圧力を緩和する簡単な方法は、巨大なページを使用することです(おそらくあなたのハードウェアはそれをサポートしています)。 Linuxでは、 libhugetlbfs morecore フックを使用できます。

HUGETLB_MORECORE=yes LD_PRELOAD=libhugetlbfs.so  ./brute_force_optimization
3
追加された
アルゴリズムにはかなりのものがあります。基本的には、n個のセットのウェイトを定義する vector を持っています。各繰り返しで、最初の vector の重みを使用して各繰り返しを計算したn個の入力セットを保持するために、一時的な vector >。これは1秒間に150K回(ボトルネック時)、mスレッドにまたがって発生します。また、重みなどを確率的に変更する2次アルゴリズムもいくつかあります。私は上記の提案を試しています。
追加された 著者 Matt Munson,
巨大なページを割り振り、 hugetlbfs マウントを作成することは、どのように技術的になるでしょうか?私は両方のリンクを見てきましたが、それはかなり関わっているようです。私はLinuxにとってかなり新しいです。
追加された 著者 Matt Munson,
あなたはこれを通って私を歩いても構わないと思いますか?また、自分のプログラムが10MB未満のRAMを使用していることを言及する必要があります。その場合、TLBが問題になりそうですか?
追加された 著者 Matt Munson,
キャッシュのローカリティについては何ができますか?
追加された 著者 Matt Munson,
私はAmazon EC2インスタンス(HVMを使用している)で動作していますので、oprofileまたはperfはオプションではないと思います。その他の提案はありますか?
追加された 著者 Matt Munson,
少なくともgprofはEC2で動作します。今私は自分のアプリケーションが std :: vector <...>演算子[](unsigned long)を呼び出す時間の52%を費やすことを知っています。そのようなメモリアクセスのボトルネックを示すことができるようだ。あなたに何かを提案しますか?
追加された 著者 Matt Munson,
うーん、巨大なtlb実験のために、いくつかの巨大なページを割り当て、 hugetlbfs マウントを作成することを忘れないでください。 hugectl(8) howto を参照してください。
追加された 著者 Brian Cain,
10MB相当のデータとその合計いいえ、TLBの圧力はおそらく支配的要因ではありません。しかし、キャッシュの局所性があるかもしれません。
追加された 著者 Brian Cain,
まあ、それが本当に問題でないなら、それは疑問です。それはすべての推測です。 perf oprofile のようなプロファイラは、キャッシュミスを見たときにどこに時間を費やしているのか、どのコードが実行されているのかを示すことができます。
追加された 著者 Brian Cain,
追加された 著者 Brian Cain,