【C++】高速化手法【SSE】2 [転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
C++やインラインアセンブラ、SSEなどによる高速化の手法
について語りましょう。
前スレ
【C++】高速化手法【SSE】
http://peace.2ch.net/test/read.cgi/tech/1130349336/ SIMDなんて-O3付けとけば自動で行われるじゃん。
それ以上は考えるだけ無駄でしょ。 >>435、ディレクティブ(#pragma omp〜)、コンパイラバージョン、環境変数OMP_NUM_THREADS、実行環境のCore/Threadsはどんなの? >>460
g++ (GCC) 10.2.0
OpenMP_CXX: -fopenmp (found version "4.5")
物理コア数2, 論理コア数4
コードは大体こんなイメージ↓
--- RayTracer.hpp
static int y = 0;
#pragma omp parallel_for num_threads(3)
for (int x = 0; x < W; ++x) {
render(result, x, y); // 重い処理(毎行0.8秒程度かかる)
}
++y;
--- Window.hpp(SDL2のメインループ)
while (!stop) {
raytracer->render(result);
applyResult(result);
} parallel_for: 誤
parallel for: 正 スレッド数も1〜4でいろいろ変えてみたら
1スレッド:一番早い
2スレッド:最悪
3スレッド:2スレよりマシ
4スレッド:3スレよりマシだけど1スレより遅い。CPU使用率100%に張り付く。
みたいな感じだった もしスレッドプールが使われていないんだったら外側のyループで並列化するのがいいんだろうな。 L1キャッシュヒット率が低すぎかな?
[1 thread]
233,710,687 cache-references:u (57.13%)
170,103,633 cache-misses:u # 72.784 % of all cache refs (57.15%)
107,023,099,494 L1-dcache-loads:u (57.12%)
172,491,811 L1-dcache-load-misses:u # 0.16% of all L1-dcache hits (57.14%)
29,286,128,938 L1-dcache-stores:u (57.11%)
<not supported> L1-dcache-store-misses:u
107,114,953,718 dTLB-loads:u (57.21%)
1,665,512 dTLB-load-misses:u # 0.00% of all dTLB cache hits (57.14%)
71.532926647 seconds time elapsed
68.955555000 seconds user
0.410194000 seconds sys
[3 thread]
2,821,811,091 cache-references:u (57.15%)
158,279,338 cache-misses:u # 5.609 % of all cache refs (57.13%)
107,538,202,753 L1-dcache-loads:u (57.13%)
1,355,563,439 L1-dcache-load-misses:u # 1.26% of all L1-dcache hits (57.16%)
29,423,932,980 L1-dcache-stores:u (57.15%)
<not supported> L1-dcache-store-misses:u
107,129,155,399 dTLB-loads:u (57.15%)
2,350,280 dTLB-load-misses:u # 0.00% of all dTLB cache hits (57.12%)
151.557505458 seconds time elapsed
253.433918000 seconds user
119.253409000 seconds sys 実行時のコアの負荷どうなってるのかと
コンパイルオプションでopenmp有効にしてるの?
してるんだったらループ内の排他制御周りで時間食ってんじゃないの あとマルチスレッドにしてる部分で大量のメモリ確保とかファイルの読み書きとかしてないよね? スレッド数に応じてCPU使用率は上がってる
排他制御は不要だからしてない マルチスレッドにしてる部分は純粋な計算のみで結果を配列に書き込んでるだけ あとはxじゃなくてyのループをpararellにするぐらいしかないんじゃね
スレッド呼び出しの回数多くなってるでしょそれ
1行0.8秒もかかるならスレッドのコストあんま関係ないような気もするけど
俺に思いつくのはApplyresultがなにかしてんのかなってぐらい このあたりのomp_get_max_threads()とか二重ループのオーバーヘッドの話はどうなん?
http://www.sanko-shoko.net/note.php?id=9twp もともと外側ループに#pragma ompつけてたけどそれも遅かった(1スレッドに比べて)
Applyresultは画面に結果を表示させる(バッファ入れ替え)だけで
処理時間は0.01秒もかからない 画面表示は別スレッドにすべきだと思うが
バッファ入れ替えのみで別スレッドで描画させてるなら多分問題ないけど
あとは暗黙のコピーでもどっか発生してるのかね
vsのopen mpだとデフォでスレッドプールしてるっぽいけどgccどうなんだろ ラムダ式にthisをキャプチャしても単なるポインタのコピーだけだよね
うーんもうあきらめようかな > 1スレッド:一番早い
> 2スレッド:最悪
> 3スレッド:2スレよりマシ
> 4スレッド:3スレよりマシだけど1スレより遅い。CPU使用率100%に張り付く。
これで結論は出てる。同期コストを見積もれない馬鹿は並列化すんなってこと。 スレッドで動かすタスクの単位がデカすぎてキャッシュに乗りきらなかった可能性ですかね
ありえそう まだその小学生の理科の実験みたいな分析を続けるのはいかがなものか。ここはム板である。
答えはコードに書いてある。夏休みの宿題じゃないから答えを見ていい。
結果とコードがあるから後はそれを理解する脳みそが足りてるかどうかだけ。
>>480
結論は出たな。キミにはこのスレはまだ早い。並列化=同期。基礎知識が全く足りてない。
コードを見てコストが読めない人が一体なにを最適化するのだ。
キミのやってることはPCパーツをとっかえひっかえしてベンチ走らす自作マニアと同じだ。 同期コストもなにも共有するリソースないし
お前みたいな雑魚に話しかけてねえよ メモリは余裕ありますね
>>477
に載ってる内容で今週末くらいに確認してみます >>466、prefのここ、一桁も違う、2C/4Tってキャッシュサイズどれくらい?orCPUの型番なに?
1T: 233,710,687 cache-references:u (57.13%)
3T: 2,821,811,091 cache-references:u (57.15%)
1T: 172,491,811 L1-dcache-load-misses:u # 0.16% of all L1-dcache hits (57.14%)
3T: 1,355,563,439 L1-dcache-load-misses:u # 1.26% of all L1-dcache hits (57.16%) >>486、すまん、タイプミスです
× pref
〇 perf ここは昔から機械語レベルの最適化スレなんだが、
そういう丸投げ系の上流の話はスレ分けたほうがよくないか。バイナリは見る気ないんだろ? ,、‐ " ̄:::゙:丶、
,r::::l3゙::::::::/ハヽ:ヽ::::、:ヽ
{::://:::::::// ヽ\ト、:::::::!
ヾ l:::::::/ 丶 `ヾ ィ、:::|
|;:r::| O` 'O ゙ハ| < ここ初心者がくるところじゃないから
ヽハ :.:. :.: レ
´\ r‐--‐、,ノ
r、 r、/ヾ ̄下ヘ
ヽヾ 三 |:l1、_ヽ/__ .ィヽ
\>ヽ/ |` } n_n| |
ヘ lノ `'ソ l゚ω゚| |
/´ /  ̄|. | >>492
そう思うなら思い当たる原因とか教えてあげたら?
一言言うだけだよ それすらできないと本当に馬鹿なのがどっちか疑われても仕方ない こんな機能あったのか
すまんな5ch使ったの最近なんだ ID:PyqKwzZq
ID:5Y5z53c+
ID:R9hS5H3t
はいはい(笑) >>493
何の切り分けもしてない頓珍漢な結果ではなく全コード出しなよ。ここム板だよ?
アセンブラわかりませんとか、自分で書いたC++コードがどういうバイナリ吐くか想像もできないとか、
最適化、高速化スレでは話にならないんだけど初心者プログラマ君。 >>488
コア内のキャッシュがコンフリクトしまくっていると予想
ハイパースレッディングをoffにして2スレッドにしたらいいと予想 HTが何か分かってないレベルでマルチスレッドにしたら遅くなったとか入門者スレでやれよ。 >>470
キャッシュライン コンフリクト ミス しまくるような
配列の数にしているんだろうね 基本無料やぞ
というかvtune使わずに最適化なんぞ出来る訳が無い ■ このスレッドは過去ログ倉庫に格納されています