1

私は、ブルートフォース最適化を行う並列化されたC++プログラムを持っています。何らかの理由で、コアあたりの収穫逓減が最大6コアになり、その時点で壁にぶつかり、さらにコアが速度を上げません。これは、8コアまたは16コアのマシンで実行した場合に一貫しています。

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

そして次々に発生するこれらのいくつか:[pid 2645] mprotect(0x7ffe78030000, 4096, PROT_READ|PROT_WRITE <unfinished ...>-[pid 2646] <... mprotect resumed> ) = 0

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

コアの数を減らすと、上記のメッセージが少なくなり、2つまたは3つのコアでは何も表示されません。

私が推測できる唯一のことは、多分それは各スレッドで行われる大量のベクトル割り当てとアクセスに関係しているということです。必要に応じて、他のメモリ管理ライブラリは使用していません。

4

1 に答える 1

3

私は、ブルートフォース最適化を行う並列化されたC++プログラムを持っています。何らかの理由で、コアあたりの収穫逓減が最大6コアになり、その時点で壁にぶつかり、さらにコアが速度を上げません。これは、8コアまたは16コアのマシンで実行した場合に一貫しています。

アルゴリズムについて説明していただけますか?多くの計算アルゴリズムはメモリに依存しています。

、を使用してアプリケーションのプロファイリングを試してください。それが不可能な場合は、oprofileを使用してください。perfgprof

私が推測できる唯一のことは、多分それは各スレッドで行われる大量のベクトル割り当てとアクセスに関係しているということです。必要に応じて、他のメモリ管理ライブラリは使用していません。

TLBのプレッシャーを軽減する非常に簡単な方法は、巨大なページを使用することです(おそらくハードウェアがそれをサポートしています)。libhugetlbfsLinuxでは、とそのmorecoreフックを使用できます。

HUGETLB_MORECORE=yes LD_PRELOAD=libhugetlbfs.so  ./brute_force_optimization
于 2011-11-25T04:01:16.463 に答える