【C++】高速化手法【SSE】2 [転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
>>189-190
みたいな頓珍漢なこというお前の言うことははなから聞く気はない >>201
上位の高速化も該当するから是非話題振ってね。
JITなんかもOK! >>203
命令レベルの並列化にしろマルチプロセッサでの並列化にしろ
クリティカルパスじゃない部分を見つけて並列化してるという点では一緒で
並列化のアプローチの仕方が違ってるだけなのは理解してるんでしょ?
命令レベルの並列化であるOoOの方が直接的にクリティカルパスの影響を受けて
並列化が並列化が制限されるようになったからハイパースレッディングが投入されたのに
メイニーコアでクリティカルパスが問題になるって言い方は引っかかるんだよ 【 オンラインTCGエディター 】 >>1
デュエル・マスターズ的な非電源TCGの 《 オンライン化ツクール系ソフト 》 制作の企画。
例えば、ガチンコ・ジャッジを直ぐにでも導入できる機能を持っておりながら、
当面それを扱わず単純化させておいて、事後的に導入拡張する際に当該システムを
ブロック構造の組み合わせで後付け挿入できるように予めシステム化してあるソフト(エディター)。
既存の非電源TCGを劣らずに再現できるならば大概のニーズに応えられる筈。
バトスピ、ヴァンガ、ウィクロス、ポケカ、デジモン、ゼクス、モンコレ、ガンダム・ウォー、ライブオン、ディメンション・ゼロ、カードヒーロー、シャーマン・キングなど
のシステムを完全再現できるように設計するけど、他に此のTCGの此のシステムは再現希望とか有ったら書いて。
マジック:ザ・ギャザリングの全システムを完全に再現するのは無理だから、此れだけは必用だ!って部分のみリクエストして。
WEB通信での対戦は、個vs個、多数乱戦、チームvsチーム、個vsチームを可能な仕様とする方針。
設計思想は 《 RPGツクール 》 が良いかな? 他に、優れたエディター有ったら挙げてみて。
個人や企業などのベンダーが提示する開発費(見積もり)で折り合えば、発注する。
↓
エディター群から基本コンセプトを絞り込む(もちろんオリジナルで優れた新ネタが有れば導入する)。
↓
遊戯王OCGに関しては、タッグフォース、ADS、デュエルオンラインを発注先ベンダーに研究させる。
なるべく前述3つで可能な再現は全て実装させる方向を目指す。 まぁ努力する・・・
バトスピ、ヴァンガ、バディ、デュエマなど発売済みゲームソフトが存在してるケースはベンダーに研究させる。
↓
各社TCGを再現するテストプレイ ⇒ 更に改良や修正。
↓
機能制限した下位版を5万円以上で発売 + デュエリ−グ用に改造した上位版でサーバー稼動=営業開始。
↑
下位版の改造および商用利用には、別途で当社との契約が必要。
さ〜て、製作ベンダー見つけよっと!ww(クス
http://wc2014.2ch.net/test/read.cgi/entrance2/1449039272/-18 さすがに[?]をエイと発音するのは苦しいぞ
実はmainie coreという架空世界のCPUの話をしているという可能性もあるけどな
学の無い語るに値しない人間なんだろう >>207
そうそう、気になって仕方なかったんだよ。 煽りじゃなくてぐうの音もでないような真実を突きつけてこそじゃねえかな 母国語英語、第二母国語C++と日本語な俺からするとMulti-をマルチって言うのも違和感あるけどな やっぱりこの板の住民は英語でレスする方が楽な感じですか?
苦手過ぎる… 匿名通信(Tor、i2p等)ができるファイル共有ソフトBitComet(ビットコメット)みたいな、
BitTorrentがオープンソースで開発されています
言語は何でも大丈夫だそうなので、P2P書きたい!って人居ませんか?
Covenantの作者(Lyrise)がそういう人と話したいそうなので、よろしければツイートお願いします
https://twitter.com/Lyrise_al
ちなみにオイラはCovenantの完成が待ち遠しいプログラミングできないアスペルガーw
The Covenant Project
概要
Covenantは、純粋P2Pのファイル共有ソフトです
目的
インターネットにおける権力による抑圧を排除することが最終的な目標です。 そのためにCovenantでは、中央に依存しない、高効率で検索能力の高いファイル共有の機能をユーザーに提供します
特徴
Covenant = Bittorrent + Abstract Network + DHT + (Search = WoT + PoW)
接続は抽象化されているので、I2P, Tor, TCP, Proxy, その他を利用可能です
DHTにはKademlia + コネクションプールを使用します
UPnPによってポートを解放することができますが、Port0でも利用可能です(接続数は少なくなります)
検索リクエスト、アップロード、ダウンロードなどのすべての通信はDHT的に分散され、特定のサーバーに依存しません
g 1次キャッシュに収まるスレッドを沢山作りたいとき、SSEやらAVX
のレジスタをメモリ代わりに使うのとメモリ直でアクセスするのとどっちが
キャッシュ乱さずに動くかな。
3次キャッシュは使いたくないし、2次キャッシュもスレッド切り替えだけに
消費させたいし。 >>223
理論的にはレジスタを使うほうが乱さないだろうけど、
コンパイラやプロセッサがどうするかは動かしてみないと分からないだろうね。 レジスタに収まるならレジスタの方が良いに決まってる 1次キャッシュに収まるなら他のキャッシュなんて気にする必要は無いと思うんだが
普通のOSで普通のコードを動かすなら、スレッド切り替えによるオーバーヘッドなんて無視できるレベルだし
そんなことを心配するよりも、肝心なコードを気にしようよ
いろんなテクニックを知ってるからコードをアップしてくれれば、小さいループならお役にたてるかも知れない 最近ニコニコ動画に上がってる経済シミュ、生態シミュ動画の人の高速化手法がすごい std::copyってsimd化などの最適化って既にされてるのかな?
sse_copy()とか自作したとして
効果は期待出来る? sse_copyとやらはmemcpy、memmoveと何が違うの? 名前的に、SSEの128bitレジスタを使ってのコピーだろう
memcpyとmemmoveの違いはぐぐればすぐわかる じゃなくて、自作しようとしているSSEでコピーするであろう「sse_copy」と
標準で用意されている「memcpy、memmove」←両方合わせて、とで
何が違うの?という話
当たり前だがmemcpyはCPUがSIMDに対応していれば使うし
カリカリにチューニングしてあるわけだが
sse_copyなど要るの? memcpyはC言語の関数だったか
存在を忘れてた
こいつは最適化入ってるのね
これ使えば良さそうだ
そうする、どうもです 条件にもよるがmemcpyあたりはコンパイラ自身がインライン展開したりする std::copy使っておけばPODならmemcpyかmemmove使うんじゃないの
VS2017のやつはmemmove使ってるな 謎の速度低下で悩んでいたが、キャッシュレイアウトって重要だな。
AVX512で一部分だけ値更新したい時、16バイト読み込んでその位置に64バイト書き戻すようなケース。
そのまま16バイト読み込みで実装すると、読み込み時に16バイト分しかキャッシュがないので、書き込む時に64バイトに拡張というか再配置されて遅くなる。
最初から64バイトで読み出すと、サイズが変化しないので遅くならない。
ついつい、読み出し量が少ない方が速いに違いないと思い込んでしまう罠。 パーシャルライトって奴だな
キャッシュにも有効なのか
昔のPenProの頃の8/16bitレジスタへの書き込み後の32bit読み出しとか
HDDが2T超える頃の4Kセクタのパーティションでの位置ずれとか
信じられないほど遅くなる要因になるもんな え、memcpy()とかstd::copy()ってSIMD使うん??
vectorのコピー遅いから困ってて、カリカリとSIMDで書こうかと思ってたんやけど、手間省けるわ。 コピーが遅いから困っててと言うけれど
どうやって遅いと結論づけたのですか?
本来なら16ms完了するはずなのに29msもかかってしまっている!
とかわかるんですか? ああ、いえいえ、言い方が悪かったですが、
処理時間に占めるコピーの割合が増えてきたので、高速化したいなぁ、と思っただけです。 rep movsbが糞速い
https://srad.jp/~miyuri/journal/569822/
>>REP MOVSはマイクロコードで実装されていて、最初にコピーサイズを見て適するコピーアルゴリズムを決めるセットアップ処理を行なってから
>>実際のコピー処理を始めるようになっている。そのため小さいサイズのコピーではセットアップ時間のオーバーヘッドが無視できないが
>>コピーサイズ(適度に大きいサイズ)とアラインメントの要件とプロセッサの世代の条件を満たすとそこそこの性能が出る。
>
>>プロセッサの世代によって展開されるマイクロプログラムが変わり最適化の度合いも変わってくると。
>>第1世代Core i以降のプロセッサのREP MOVSのマイクロコードは比較的速い。
デコード済みの命令をキャッシュ出来るようになったから、マイクロコード展開命令でも最適化が行われるようになってるみたいだよ。 メモリのレイテンシ、スループットやキャッシュサイズに依存するんだから
ブロック転送命令の最適化は無駄な努力だとインテルは思ってんだろう。 Visual Studio 2017 で
memcpyを調べてみた
x86は rep movs
x64は vmovups 128bit 2パラ16アンロール
オプションでAVX2命令を使うようにしてもかわらず
vmovaps 256bit/512bitの方が速いから
頻繁に使うなら自作した方が良い >>238
キャッシュ可な領域はキャッシュライン単位でDRAMの読み書きが行われるはずだから
キャッシュは関係ないでしょ。 >>246
アライメントのほうだったかも。
境界跨いで更新する時、あらかじめ更新サイズで読み出しておけば、全領域使用可能状態になるが、読み出し半分だと残り分キャッシュ要求発生して遅くなると。 >>247
一定のストライドで読み込んでいれば自動プリフェッチで早めにキャッシュに取り込まれる可能性もあるけど、
DRAMの帯域を圧迫しないようにページ境界をまたいでは機能しないようになってるはずだったので、
AVX512のベクタ長だと、何サイクルか先のループで使うデータをプリフェッチで要求した方がいいかも。 >>248
ありがとう。すでに別件でPrefetchもやってみてるけど、AVX512だとかなり効果があった。 >>249
一時は自動プリフェッチの性能が向上してあまりprefetchの意味がない状態が続いていたけど、
AVX512ともなると1ページ分のデータをループ64回で消費しちゃうんだよな…
DRAMのCASレイテンシをCPUクロックで換算すると結構長いからね。 え?AVX512は手書きprefetchのほうが性能出る?
これまではハードウェアプリフェッチが超優秀で、手書きprefetchはむしろオーバーヘッドになって遅くなる感じだったんだけど。 prefetchはハードウェアにまかせて手書きでclflush入れるのが一番いい感じなんだけど。こんなケースは少数派なのかな。 xeonでavx命令使うと過熱防止のため1ms間、動作クロック下げるなんて聞いてないよ〜(>∀<) ☆ 日本の、改憲を行いましょう。現在、衆議員と参議院の
両院で、改憲議員が3分の2を超えております。
『憲法改正国民投票法』、でググってみてください。国会の発議は
すでに可能です。平和は勝ち取るものです。お願い致します。☆☆ 僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』
YF4RO 過熱してなくても1ms間、強制的にクロック下げるん? >>257、そうみたいなんですよ
https://pc.watch.impress.co.jp/img/pcw/docs/665/641/html/14.png.html
> AVX命令が実行されるときに、CPUはAVXベースで定義されている
> クロック周波数に一時的に下がって実行し、実行終了後元のベースクロックに戻る
> AVX命令の実行完了後1ms程度で通常(非AVX)動作モードに復帰 AVXが有効な処理なら微妙にクロックが落ちようがどうでもいい クロックが高いのが目的じゃなくて
処理が速いのが目的
その辺がよくわかってないアホがいるみたい Programmable Calculation Unit (嘘) XEON、AVX-512だとさらにクロック下がるぞ
コア数多いとさらにクロック低下するでw
Platinum 8180M 28C 2.5GHz -> 2.1GHz(AVX2) -> 1.7GHz(AVX-512)
Platinum 8153 16C 2.0GHz -> 1.6GHz(AVX2) -> 1.2GHz(AVX-512) そもそも4倍の量が同時に計算できるわけだから
クロックが半分になっても元は取れる クロックが実際は半分にならないから
メリットは高速化 これsum1()とsum2()でだいぶスピード違うんだが、みんな知ってた?
#include<vector>
#include<iostream>
using namespace std;
class Tree{
public:
long long i;
vector<Tree> v;
Tree(){i=0;}
long long sum1(){
long long x=i;
for(vector<Tree>::iterator p=v.begin();p!=v.end();++p)x+=p->sum1();
return x;}
long long sum2(){
long long x=i;
for(auto p:v)x+=p.sum2();
return x;}
};
void big_tree(Tree *t,int d){
t->i=d;
if(d<=0)return;
t->v.push_back(Tree());
t->v.push_back(Tree());
big_tree(&(t->v[0]),d-1);
big_tree(&(t->v[1]),d-1);}
int main(){
Tree t;
big_tree(&t,20);
cout<<t.sum1()<<endl;
cout<<t.sum2()<<endl;
} そりゃ、やってることが違うんだから
同じにしたけりゃ sum2 で for (auto& p: v) にしてみ うお、autoってこんな書き方も出来るのかよw
勉強になりました。 結果は同じだろ? 鬼のように発生するコピーのためにメモリ不足で死なない限りは。 C++は、書いた通りに実行されるだけ。
高速な処理が必要なら、そう実行されるように実装しないと。 まるでC++コンパイラは最適化しないとかデタラメな言い分けだな。 何のためにコピーしてるん? 使い方間違ってんじゃね? reserveせずのpush_backしまくるバカのことじゃね? push_backしまくってもそれほどパフォーマンスは悪化しないように出来てるはずだが
コピーしまくりっていうんだから関数で値渡ししてるとかじゃないか?
いずれにしろC++自体の問題ではない データの並び順やアルゴリズム、...
この辺がパフォーマンスに大きな影響を与える
コンパイラの最適化なんぞ知れてる
その辺を最適化したければガシガシアセンブラだが
その前にいくらでもやることがあるのが普通 メインメモリが相対的に遅くなってきてるので
データの並びは非常に重要
大きなデータはディスクアクセスのような感覚で扱わないとダメ 突っ込みどころもあるが1年前のレスに真面目に返答してるおまえを評価する。 x おまえ
o おまえら
って書こうとしたが
同じ人だった orz 組み込み関数でSIMD命令駆使すれば、しっかり高速化されてキモティー! >>292
アセンブラを使わなくても速度チューニングネタはたくさんあるが
当然最後の手段としてはアセンブラは有効
小さいループに処理が集中してるような処理は
特に効果的
下手くそがアセンブラに手を出すと逆に遅くなったりもするけど >>292
急にどうしたw
レジスタ割り当て面倒くさいから、Intrinsics使うの普通だぞ >>295
>>286が
>コンパイラの最適化なんぞ知れてる
>その辺を最適化したければガシガシアセンブラだが
とか書いてたから
この人10年くらい時間が止まってるよね
64bitと32bitじゃレジスタの数も違うし、SIMDの新命令に対応させるたびに
レジスタ割り付けが全く変わってしまうこともあるのにアセンブラって…
AVXなら3オペランドも使えるから、コンパイラに任せてもコードの質は低下しにくくなってるはず 費用対効果を考えればIntrinsicsでも良いけど
究極の最適化はアセンブラしか無い
IACAを使ったり実測したりしながらパズルする
処理が非常に単純で速度の求められる小規模DSPなんかでも
いまだにそういう開発をする >>297
IACA=Intel Architecture Code Analyzer
ですよね。 SIMDを覚えたての初心者はこんなコードを書きやすい
典型的な糞コード
ループ {
sum = _mm_add_ps(sum, data[i]);
}
>>299
そうです >>298
CPU, GPU, FPGA
それぞれ得意分野が違うから GPUユニットはCPUに乗っけたのだから後はFPGAも乗っけるだけ。
アルテラは既に買収済みだしな。 スパコン分野じゃ固定の計算式はFPGAが一番効率的。そういう意味で地球シミュレータや京はゴミ。
スパコンが必要な分野でCPUのような汎用性などいらない。 今度はスパコンが出て来たか
関わったこともないだろうに
スーパーコンピューターこそ汎用性が必要
ベクトルコンピューターが消えたのも
より汎用性を重視するから
スーパーコンピューターの世界でFPGAが求められてるなら
当然スーパーFPGAが流行ってないと辻褄が合わないわけだけど
流行ってないね 何を言ってるからよく分からないなぁ。
特定の式を大量に速く計算したいという要望に対してなんで汎用性が出てくるの?
汎用性スパコンが1億なら同じ性能で1000万で達成できるんだよ。
しかも汎用性のために可用性が落ちるとか話にならないよ。京見れば分かるでしょ。 FPGAとかスーパーコンピューターとか自分専用とか
具体的な処理を何も語ってないのによくもまあ勝手に前提を作るよなあ
ここはソフトの最適化のスレなんだけど FPGAなんかで妥協しないでASICでも作れば良いよ FPGAだってプログラムでコーディングするんだが・・・。勝手な前提作ってるのはおまえじゃん。
というかSSEでの高速化がOKなら、GPGPU、FPGAもOKだろう。 1年もレスが無かった過疎スレになんでこんな必死な自治厨がいるのだろうw
前スレも10年かけて1スレ消費したんだぞw
おまえは何者だw ID:EqcpRCSG = >>311 = >>313 か?
こんな過疎スレで布教ってw マジおまえここの住人じゃないんだな。 >>312
前に64bitで絶対アドレス使えって書いて突っ込み受けたらファビョってたのいたでしょ
あれと同一人物っぽいんだよなあ
>究極の最適化はアセンブラしか無い
とか書くところとか
午後のこ〜だの開発者たちが動画コーデックの開発しなかったのだって、
MMXは除外しても、SSE2、SSE3、SSSE3、SSE4、SSE4.1、AVX、AVX2、AVX512に加えて、
64bitでは一気に種類が2倍と、次々と登場する新命令ごとに最速のルーチン用意していく手間と、
コードが異なるために特定のCPUでしか発現しないバグがでるリスクが増すこと考えたら、
最速に拘るのが現実的ではなくなったんだよ
彼らとしては妥協したコード書く気はなかっただろうし、興味が失せるのも仕方ないのかもね
AVISynthもインラインアセンブラ使ったプラグインだらけで64bit化に対応できずに放置されてたのが
相当あったけど、自分も64bit化やった経験からも、今更初心者にアセンブラ使えなんて教えんなと言いたい 初心者ならIntrinsicsなんか使わないで素直に汎用性のあるC++で書くかライブラリを使えばいいよ
ここは高速化手法スレだから高速なコードであることは重要
Intrinsicsよりアセンブラの方が高速に書けるのは自明なのでアセンブラの話題は当然出てくる Intrinsicsで32bit/64bitの共通化は出来ても
新命令がでたらどうせ作り直しだよ
新命令に最適化しないならそのままでいいよ
「新命令対応」て謳うのが目的じゃなければ
SSEからAVXの移植もレーン縛りで苦労しただろ?
単純に置き換えなんて出来ない
128bitのまま単に3オペとレジスタ数だけなら簡単だけど
AVX512も同じ
マスクレジスタや新命令を使うなら書き直し アセンブラ狂信者じゃない
Intrinsicsも使う
極限な最適化にはアセンブラが必要ってだけ
まあ当然だ どうせ今後は32bit向けの最適化なんかやらんだろ
だとすると手間の差はレジスタ管理くらい >>320
>だとすると手間の差はレジスタ管理くらい
こんなこと書くようだと大したコードは書けないな
レジスタ割り付けの妙味と面倒さを知らないのなら、別に組み込み関数で書いても構わないだろ >>321
レジスタ割り付けの妙味www
さほど時間をかけなくてもコンパイラよりマシなのは作れるよ
そもそもIntrinsicsの時点でもレジスタ数削減は考えるべきであって
何も考えなきゃIntrinsicsだろうがアセンブラだろうが遅い 詳しい自信があるなら
とりあえず問題ありまくりな>>300の問題点でも語ってみようか SIMDの一番簡単とも思えるこんなコードでも
最適化に関して語れることは山ほどある >>322
やっぱこいつ絶対アドレス君だw
妙味の部分に草生やすってことは大したコード書いてない証拠みたいなもんだよ
コンパイラより1%速くなっただけでもドヤ顔するタイプだろ 絶対アドレス?
一番アクセスが速いのはスタック
ほぼ確実にL1キャッシュにある
一等地 アドレス含め、
デカい即値は色々と遅くなる要素だぞ 300 みたいなことはこのスレの本来の住民なら誰でも知ってるから
いちいち講釈垂れるのはスレの無駄遣いだからやらないだけ
FPGA だって互換性気にしなければオリジナルの CPU の IP 書けば済む話で
少なくともこの板でやる話ではない >>329
>>300にいろんな要素が詰まってるわけだけど
どの程度わかるかな? >>315
>MMXは除外しても、SSE2、SSE3、SSSE3、SSE4、SSE4.1、AVX、AVX2、AVX512に加えて、
>64bitでは一気に種類が2倍と、次々と登場する新命令ごとに最速のルーチン用意していく手間と、
知らなくてもいいことかもしれないけど、これはアセンブラ作者泣かせでもあったりする。
命令数が多すぎるので手作業での入力は例えテーブル方式を採用していても無理が有り、
インストラクションセットの表を自動的にテーブルに変換するようなプログラムをしなくては
ならなくなってきている。 >>300は非常に良い教材だよ
これだけで語れることは山ほどある
「誰でも知ってる」なんて言う人は
ほとんど何も知らない初心者だけ
>>332
全てのCPUに対して最適化したコードを書く人なんていないだろ
せいぜい128bit, 256bit, 512bit の3バージョンくらい
32bit 512bit なんていらんだろうし
マーケティング上の理由で作らされてる人がいるのか?
それなら御愁傷様
本当に最適化するなら対応命令だけじゃダメ
IceLakeはAVX512が遅いし
AMDも昔はAVXがとても遅い >>333
アセンブラ=アセンブリ言語を処理してマシン語に変換するコンパイラ
の話。 前半からアセンブリ言語での記述の話だと思ってしまった
命令数めちゃくちゃ多いよね
多いだけじゃなくて複雑にもなってる
{k1} とか {z} とか
まあそれでも(高級言語の)コンパイラを作るよりははるかに楽だろうけど >>326
前にアセンブラスレでこんなこと書いてた変なのがいたんだよ
>実際には問題がある。なぜなら、そんなにアドレスが大きいと、さっきから話題の
>mov al, my_mojiretu[rbx]
>という命令が使えなくなるからだ。
とか、
>RIP相対32bitdispだとアクセスできない場合が出てくる
>シンボルがRIP相対2GBに制限されるなどはあくまでCコンパイラの制限であって
>アセンブラはその制限を受けない
ちょっと考えれば64bitなのに2GB制限するオプションとか使ってDLLも作れなくなるような
記法が推奨されてるはずないよな
それで複数の人から突っ込まれたら、誤りを認めて引っ込めばいいものを、
ファビョって連投しまくるから、皆呆れて無視したってことがあったんだよ
挙句にこんなことまで言い出したり
>自分は 64BIT 用C/C++コンパイラをインストールして無いので、試せません。
>>326だってこいつの言ってることはおかしいと思うだろ? >>336
その人は、64BIT命令にとても詳し過ぎてみんなが理解できなかったようだ。 >>338
Microsoftの人より頭いいんだw
でも連投してるときはあまり余裕無さそうだったよw >>339
MSの人より頭が言いなんて、当たり前じゃない。
日本人をなめてはいけない。 純粋に技術競争になったら、日本は絶対にアメリカに勝つ。
いつもそうだったし、IT分野でもそう。
問題はアメリカ人は自分が負けそうになると、圧力をかけて壊してくることだ。 >>341
そういう考え方情けないわ
お前がまず手本を示して見ろよ >>336
そこだけ抜き出しても何が言いたいのかわかりません
スレタイとは関係なく
ただ人をバカにするためだけの書き込みなら
感心しない >>342
そうそう
40〜50行程度の32bitSSEの自慢のコード片を晒せば大体の実力は判るんじゃないかな
でもね、自分が本気で最適化する時は、IACAの分析結果じゃいい加減すぎて役に立たないから
人力で計算してたんだよね
社外に秘密にしたいパイプラインの実装の詳細を気前よくツールに実装するはずないよね
だから、IACAを使って最適化してるのを自慢してる辺り、あまり期待はしてないけどね IACAの使い方間違ってないか?
自力で計算するための情報を手っ取り早く得る為の物だぞ >>342
IT関連は狡猾な人が多いので、アイデアだけ真似されるので完成するまでは
公開しない。 >>344
40〜50行程度になる題材があればコードを書くよ
今更32bit SSEってのも
時代についていってない感じでイマイチだけど
最適化はその時代のCPU向けでいいのかな? >>341
IT分野で日本が技術力で勝ってると思ってるの?
頭がお花畑で良いねえ >>349
多くは無いが個人レベルでは勝てる人はいる。 量子コンピューターに日本人の名前がクレジットされる可能性は高い。
一方、○○互換のソフトウェアはほぼ100%が中国発。
一見欧州製のように見えてもほぼほぼ中国。
人工知能に中国人の名前がクレジットされる可能性は相当高い。 おそらく世界最初の人工知能は春麗とかいう名前になる。 >>352
日本の平均レベルが低いからといって、このスレに来ている人全員のレベルが
低いことにはならないということだよ。 日本とアメリカの技術力の比較の話から
なんで個人の能力に話をすり替える? >>355
日本では、かつては半導体業界に優秀な人が集まっていた。
その当時、日本を引っ張っていたのは平均レベルの人達ではなかったんだよ。
自分の周りの平均以下のプログラマを見て、それが日本を代表するプログラマの
レベルだと思ってもらっては困る。 しかも
勝てる人もいる
って
アメリカのトップに勝つ人がいるって言うなら多少の意味はあるけど 様は、生まれつきのIQや理解力や記憶力の話だ。
努力とかじゃない。純粋のそういうものを比較すれば、日本のTOP層は
MSのTOP層と互角に戦える。 >>357
TOPに勝てる人は要るよ。数学オリンピックとか見ていたら分かる。 IQ、理解力、記憶力
技術力からずいぶんと話題が変わって来たね >>359
想像じゃなくて具体的に示してください
数学オリンピックって
俺も出たけどね
そんな高校生の遊びと技術力を同一視しないで >>361
あなたは数学ヲタクなだけでプログラミングが出来ないから
生意気なことを言ってるのか? 本当に地数学オリンピックに出られるなら、プログラミングなんてアホみたいに
簡単なはずだ。嘘なんじゃないか。 >>363
プログラミングは勝負の世界ではなく、お金の世界だ。
金儲けの手段。数学がそんなに出来りゃ学者にでもなればいい。
コンピュータ系の教授なら簡単になれるはずだ。 勘違いしてる人がいるようだが、本当に数学オリンピックに出るような人は、
いろいろなことが出来て、プログラミングなんて簡単に出来てしまう。
実例で行けば語学も堪能で13ヶ国語がぺらぺら立ったりする人までいる。
実際、数学オリンピックに出られるような人は、自分でもそれが分かる。
何もかも簡単に理解できるのだ。 単なる局所的な最適化、高速化
と
コーディング
と
ソフト開発
は全然違うから
>>365
じゃあ収入で勝負するか? >>368
そんなことない。数学は頭脳の頂点にあるので、本当に何でも出来る。 数学の天才が本気で高速化したコード
興味があるなら素直にそういえば良いのに >>370
そんなのには興味ない。
俺も天才だし。 >>374
掲示板書き込みは、頭を使わないので簡単に出来るので全然違う。
他の人が思ってるように検索して調べることもしてない。
記憶に頼って書いてるだけなので簡単。一人には高度に見えるかも
しれないが、頭は停止状態で書いている。掲示板書き込みは頭の休憩。
プログラミングの勝負などは脳のフル活動が必要になるので
絶対にしたくない。特に天才の脳はフル活動すると疲れる。凡人とは違う
かも知れない。 >>375
誤:記憶に頼って書いてるだけなので簡単。一人には高度に見えるかも
正:記憶に頼って書いてるだけなので簡単。一般人には高度に見えるかも
ちなみに誤字脱字が多いのも、頭を休めながらテキトーに書いているからだ。
長文だから必死に書いている事は無い。キーボードはスラスラ打てるから。
一般人には分からないだろう。 数オリに幻想を抱いてるようじゃ
能力も知れてる
でもびっくりするくらい数学を知らない人もいるよね
自信満々でアップした行列の掛け算のコード
実は行列の掛け算を知らなくて掛け算になってないとか >>377
数学オリンピックは、出るだけでも少なくとも東大や、東大の大学院に入るより
ずっと難しい。マイクロソフトに入社するよりも難しい。
ハーバードやMITよりもずっと難しい。
工学系の教授になるよりも難しい。 >>378
それを俺に言ってどうするの?
俺のファンか? >>380
本当にそんなに頭がいいなら、どっかの教授にでもなったらいいでしょう。
こんなところで人を馬鹿にしてはいけません。 まあなんでもいいや
話をスレタイに戻そうぜ
とりあえず天才の>>381
>>300のコードの問題点と修正コードをよろしくね >>382
俺は虚言ではない。
俺が嘘をついていると思ってるから、嘘で対抗しているの?
それは間違い。 >>383
SIMD命令には詳しく無いので、検索して調べないといけないのでやりません。
ここは頭を休める場所として使っているので、頭を使うことは出来ないのです。 実は、高IQ者が休憩時間に簡単なおしゃべりのつもりで言っていることが、
一般人には、高度すぎて勝負をしてきていると思ったりする可能性があります。
こういうことでギフテッドは一般の学校でトラブルになり易いのです。
本人は勝負のつもりではなく、とても簡単に言っているのです。一般人は、
勝負だと受け止めます。これが軋轢になるのです。 じゃあ何に詳しいんだ?
別に頭を使うようなコードでもないけどねえ
単なる知識の問題
考慮すべき内容は大きく分けて5個 マウンティング合戦で過疎スレを伸ばさないでくれよ。
質問攻めして相手の揚げ足取りって馬鹿左翼みたいだし。
ループ {
sum = _mm_add_ps(sum, data[i]);
}
について語れるなら結論だけ書いてOKだよ。 ・レイテンシとスループット
・メモリ帯域
・CPUと搭載命令
・演算の順番と精度
・処理の構成
SIMDの一番簡単とも思えるこのコードで
このくらい語れることはある ・レイテンシとスループット
ADDPSは多くのCPUで
レイテンシ 3〜4クロック
スループット 0.5クロック/命令
(メモリリードもL1にデータがあれば0.5)
このコードは、
前の演算結果を使うので
このままだと1回のループに3〜4クロックかかってしまう
スループットを生かすには8個並列にする
ループ {
sum0 = _mm_add_ps(sum0, data[0]);
sum1 = _mm_add_ps(sum1, data[1]);
sum2 = _mm_add_ps(sum2, data[2]);
sum3 = _mm_add_ps(sum3, data[3]);
sum4 = _mm_add_ps(sum4, data[4]);
sum5 = _mm_add_ps(sum5, data[5]);
sum6 = _mm_add_ps(sum6, data[6]);
sum7 = _mm_add_ps(sum7, data[7]);
data += 8;
}
32bitコードでもSIMDレジスタが8個あるので
コンパイラはsumをレジスタに割り当ててくれることが期待できる
(一応確認する) ・メモリ帯域 / 処理の構成
このコードの性能が生かせるのは、
データがL1にある場合
メインメモリは非常に遅いので
大きなデータにこのループを使うと
ほとんど待ち時間になってしまう
(HTTなら他方のスレッドが動き放題)
小さなデータで頻繁に呼ばれるのであれば意味があるが(例えば低レイテンシが要求されるオーディオ処理)
大きなデータの場合はほとんどがメモリアクセス時間になってしまう
L1やL2に入るようにこまめにサイズを区切りながら処理をするとか
他の処理も合わせてループにすれば
メインメモリの帯域による性能劣化を減らす事が出来る
なのでこのループ自体の存在をまずは疑問視しよう ・CPUと搭載命令
128bit命令は古い
パフォーマンスが重要であれば
より性能のある256bit命令、512bit命令を使う
その為に、搭載命令を判別すること
・アラインメントと端数処理
メモリはキャッシュ境界をまたがない場合に性能が出る
今回の場合はデータが1個なので
前側端数と後側端数をゆっくり処理して
それ以外を高速なコードで処理をする
・演算順と演算精度
演算の順番で精度が悪化することがあるので注意
今回のコードは順番に足していくが
これは精度が悪化する順番である
(2^24個を超える個数の1を加え続ける事を考えると分かりやすい) >>397
なるほどね。かなり勉強になりました。
こんだけ簡潔に日本語で説明されているものは、そう簡単には
ネット検索では見つけられないんじゃないかと思います。
SIMD命令には詳しく有りませんが、ちゃんとレイテンシのことまで
考えないと真価を発揮できないようですね。
知りませんけど、Intelコンパイラでもここまでは自動最適化で
やってくれないかもしれませんね。実際どうなのかお聞きしてみたいものですが。
実はコンパイラの最適化というものは、コンパイラ作者自身はやりたいと思っていても、
実際にコンピュータに自動的にやらせるのは結構大変なものなのです。
細かな注意点が沢山あるためです。最大の問題は、レジスタが無限に
あるわけではないことと、特定のレジスタにしか対応していないマシン語が
あることから来ます。もう一つは、さまざまな型やサイズの変数があるために、
色々なパターンに対応するのが難しいことにあります。
そういうこととに加えてレイテンシの自動配慮などを行おうとすると、最適化を
自動的に行うコードは非常に複雑で膨大な量になるのです。
また、今のCPUには、レジスタは16本くらいと結構沢山有るので、レジスタが不足した
場合の処理は、滅多にテストできません。そのため、その最適化処理はなかなか
テストできないのです。ですので、生半可なテストでは間違いが含まれていても
分からないままコンパイラを出荷してしまう事がありえます。敢えてレジスタが3本しか
使えないようにした状態でコンパイラをテストしたりする方法も一つの手です。
または、テストを余りしなくても明らかに正しいことが分かるようにコーディングする
ことです。しかし、それは余り簡単なことでは有りません。 >>400
最適化に関して。
例えば、最適化は、色々なパターンの最適化をどのような順序で施すかによって、
最終コードの質が変わってくることがあります。というのは、人間にとっては
割と大丈夫なのですが、コンパイラにとっては、非常に複雑でそれ以上最適化
できないようなコードに見える状態に陥ってしまうことがあるからです。
普通は、少しずつ良いコードになるよな修正を何度も何度も繰り返して、それ以上
良いコードになる方法が分からなくなった時点で最適化が終わります。
ところが、いったん、悪いコードにしてから、もう一度最適化をしてみると、
最後のコードは良いコードになる場合があります。このような最適化は人間には
余り難しくないのですが、コンパイラにとっては大変なのです。
なぜなら、悪いコードになってもいい事を許しだすと、オセロの先読みの min, max
方の様な試行錯誤型の人工知能的なものが必要になるのですが、そのような最適化は、
普段は余り効果を発揮しにくいのに、処理時間が膨大になるためです。
人間は、一度最適化したコードは、何年もそのまま使います。ところが、コンパイラは、
10分に一度くらいは、ビルドし直します。ですので、最適化にかけられる時間が違うのです。
CPUが人間より速くても、このような事情があるので、人間より良いコードを出すのは
案外難しいのです。 アルゴリズムの最適化なら組み込み関数でもできる
なのに、アセンブラを使う理由があるのかって話なのに、なんで組み込み関数のサンプルなんだ?
自慢のコード片ってのは、アセンブラで書いたのに決まってるでしょ
言い争いしてたどっちが>>316なんだ? 「究極の最適化はアセンブラしかない」
これに反対する人はいないよな?
SIMDの高速化でIntrinsicsに対しての話
アルゴリズムの最適化?
そんなものIntrinsicsを使う必要すら無い 実際の開発現場では
(アセンブラではなくて)Intrinsicsを使うことが多い
これも別に誰も反対していない >>405
なんかあんたの主張はずれてんだよな
本当に「究極」を求めるのなら、自分も>>298が書いてるように、何もCPUのソフトウェアに
限定せずFPGAでもなんでも使えばいいと思う
Googleだって、TensorFlow専用のプロセッサを開発して運用してる
組み込み関数の利点としては、32bit・64bit、SSE・AVXへの変更はコンパイラのオプションだけで可能ってこと
XMMでも多少は速くなるのと、AVX2やAVX512への移植もインラインアセンブラからよりははるかにしやすい
Microsoftが64bit版VCでインラインアセンブラを廃止したのは賢明だと思う
アセンブリの致命的な欠点は、アルゴリズム上の変数とレジスタが一対一で対応しないことで、
上のsum1みたいな名前付きの変数でないことと、常にどのレジスタがどの変数を保持しているか追跡しなきゃならない
それに、インラインアセンブラが使えないコンパイラだと、インライン関数やOpenMPも使いづらい
シングルスレッドで1%速くなるよりOpenMPで手軽にマルチスレッド化した方が、よりお手軽に速くなる
それでもアセンブリを使いたいっていうなら、オープンソースでないか、組み込み関数より
最低でも5%、できれば10%以上速くなる時にして欲しい
世の中にはインラインアセンブラで書かれたがために64bitで動かせずに放置されたオープンソースの
プロジェクトが結構あるんだよ(特にAVISynthなどの動画フィルタプラグインとか、オープンソースではないけど、
Aviutlも作者がインラインアセンブラ?を使いまくったせいで64bit化出来ずにいる) >>408
横からだけど、最後の方はわかるけどコンパイラオプションのは組み込み関係ないし
単一の浮動小数点演算をSSEのレジスタ使うだけっしょ
あとハードの制約を外すんならSSEだのAVXだの選択肢に入らんでしょ
一般のPCにみんなついてるGPUだって使えるんだから
CPUの拡張命令を使うのはそれなりにハードの制約があるからだ ここはCPUの高速化のスレだから
GPUやFPGAの話は他で >>409
64bitはコンパイラオプションではなかったけど、わざわざ各バージョン向けのコードを用意しなくても
開発環境でまとめてビルドできるでしょ
>>410
たかがアセンブリで書いたくらいで「究極」なんてドヤ顔すんなってこと
頭のいいGoogleの人達は専用プロセッサを開発する選択をした
そこまで自信があるのなら、40〜50行程度の32bitSSEのアセンブリで書かれた自慢のコード片を晒してみたら? >>413
「弘法筆を選ばず」って諺があるように、本当に才能のある人はわざわざ手段限定してドヤ顔したりしないだろ
せこいマウント合戦繰り広げてたの見てると、器の小ささを感じてしまうんだよな
そんなの恥ずかしいから止めとけよ
それより、エレガントなコード片晒した方がかっこいいぞ Intelは、何年も前からパラレル・ユニバースってキャッチフレーズで細粒度のマルチスレッディングを
推進していて、Threading Building Block(TBB)とかOpenMPなんかを使って並列化で速度を稼げと言ってる
現在では、IntelのIPPやMKLもフリー化されて、定番の処理は予め用意されてる
動画処理なんかでも、フィルタやフレーム別に複数のバッファを用意してマルチスレッド化してると
スループットを稼ぐようになってるので、最適化が甘くてもハイパースレッディングで実行ユニットは埋められる
GPUで計算する場合はライブラリ呼び出しだし、64bitでインラインアセンブラを使えるIntelのコンパイラは
700ドル以上するし、GCCのasmは癖が強すぎてMASMやNASMへの移植の障害になるほど
そういうことで、現在では「アセンブリで究極の最適化」なんて、時代に取り残された年寄りの妄言みたいな
状態になってるから、組み込み関数使って保守性をよくしておけばいい マルチスレッド化してスループットを稼ぐようになってるので >>417
NetBurstと違って、スパコンの主流が数千から数十万コア以上の超並列マシンになって
そろそろ20年近く経つのに、まだこんなこと言ってるのがいるんだな
よくまあ、これで最適化を語ってたものだ なんでPen4なんかを持ち出すのか引っかかってたけど、もしかしてNehalem以降のCPUで
ハイパースレッディングが復活してるのも知らなかったとか?
>>286や>>287で
>コンパイラの最適化なんぞ知れてる
>その辺を最適化したければガシガシアセンブラだが
とか書いてたのがおかしいと思ったんだよな
シングルスレッドでしか動かないCPUなんかで、
HaswellやSkylake、IceLakeみたいな実行部の強化をするはずないだろ
OpenMPやTBBでマルチスレッド化すればベクタ化は組み込み関数でも十分だし、
メモリアクセスがネックになってるのに、どうしてマルチスレッドによる並列化に言及しないのか不思議だったんだよな スレッド分けももちろん重要です
まあ安直にOpenMPでも良いんですが
これも究極はスクラッチ
スーパーコンピューターと違って
普通のPCだとせいぜいHTTとマルチコアなので
まあそれほど複雑ではないですが
>>300の例だと、
演算ポートもロードポートもガラガラなので
HTTは非常に有効です
データがL1にあれば性能はほぼ倍になります
一方>>394の場合は演算ポートもロードポートもフルに使ってるので、
HTTの効果はありません
汎用整数命令や整数ベクタを使うスレッドに分けてあげましょう
まとまった単純な処理でHTTの効果が大きい物は
ポートがスカスカな糞コードですね
メモリ帯域で大きく性能が変わるコードも糞コード
これは>>395の通り スレッドの分け方はこのスレの趣旨とは違いそうなのでこの辺で > NetBurstと違って、スパコンの主流が数千から数十万コア以上の超並列マシンになってそろそろ20年近く経つ
というかこの人は何を言ってるのだろう。
スパコンなんて40年以上前から並列処理の性能ということも知らんとかまだ子供か学生かな?
当時のPen4のことも全然知らないんじゃないだろうか。NetBurstとスパコン比べて何が言いたかったのだろう。 ちょいとメンテがてらにmasm弄ってるんだけど、
mov r/m64, imm32 形式のバイナリ吐かせる記述方法がわからん。 自己レスになるが、符号付き与えると符号拡張されるようだった
mov rax, -1
↓これと同じ結果
mov rax, 0FFFFFFFFFFFFFFFFh
VS2019だと
return 0xFFFFFFFFFFFFFFFF;
これが最適化されてコンパクトになっていたという話。やっぱアセンブラめんどい。 ICC 19.1って32bitで最適化してビルドすると、コード生成の拡張命令でSSE2やAVX未満を指定してもAVXのコード吐き出す事がある謎の仕様があって困る。というかたぶんバグ。
できあがったコードに正常でない無効なオペランドが含まれたり要はぶっ壊れてる。
これを回避するには、最適化 /Od 無効で任意の拡張命令を指定するとAVXが含まれずに正常なコードになるが、最適化はたぶんされていないだろうな・・・。
古い環境作ってレガシー用のビルド環境まだ要るんかなあ。 さすがにバグレポート送るべき
再現できるコードとその時のオプションを添えて
とはいえ、既に世界の誰かが同じことをやっている可能性は大 謎のAVX出力は_mulx_u32が原因だった。
てっきりただの乗算と思いきや、これBMI2つまりAVX2の命令セット世代なんですね。
おそらくベクトル化を試みるかをした時、コンパイラ内部の命令セットのフラグがAVX2に上書きされて処理がおかしくなっていると予想。
今回の問題が無かったにせよ、非AVX2環境では動かないコードになっていたので自分のバグでもあるが、普通に動く場合もあるので注意がいる。 正常な動作しなかったんだからそれは普通にバグでしょ 人によるな
わいの場合99%はCPUやOS、コンパイラのバグだな レイトレでOpenMP使ったら早くなるかと試したけど却って遅くなった
各ピクセルの演算には特に共有するコンテキストとかあるわけじゃないのに
変に安全装置が働いているんだろうか? >>435
OpenMPはオーバーヘッドが大きいから細粒度の並列化には不向きだよ。
CPUでやるなら、せめてSIMD。 細粒度もなにも、OpenMPはもともと4並列とか8並列とかコア数に合わせてやるもんだろう。
まさかピクセル数分だけ並列化すると思ってるのか? >>435
restrictつけたら速くなるかも?
わからんけど chinebenchなんかもレイトレだけど普通にコア数分早くなるでしょ
設計がまずいだけじゃないの 自作erレベルじゃなくム板なのでコード見てもう少し深く原因を解析してくれ。 エリアで処理範囲分けるべきとこをほんとに1ピクセルずつ計算させてんのかな どう解析したらいいかがわからない
とりあえずThreadPool使って1行を3分割して3スレッドで描画
3つのスレッドのタスクが完了するまで待機
って感じのことをやってみたらOpenMPでやったのと同じような程度で
処理速度が劣化した
(毎行描画ごとにSDLに制御を返してる) SIMDも気になるけど知識がないから時間かかりそう レイトレにSIMDなんてそれこそ向いてないと思うが。 そういうのは、ム板よりLinux板のほうが詳しいんじゃないだろか。 レイトレあたりになると数学が関わってくるので、Linux板で聞いたほうが良いと思う。 んなこといいはじめたら、SIGGRAPHとか論文のほうが。w SIGGRAPHで発表されたばかりの先端的アルゴリズムなら、ここで質問するよりMAC板で聞いたほうが良い。
あるいは、先端アルゴリズムの数学的な部分についてはLinux板も詳しい。
MAC板は、人工頭脳を使ったグラフィック表現なども研究してるので、世界で通用すると思う。 3スレッドでやっても時間が変わらなかったという時点で何かポカしているんだと思うが、
じゃあレンダリングするピクセル数を減らしたらそれに比例して時間が短縮するだろうか。 >>442
vsならオプションでopenmp効かせてる? ム板は基本がおろそかなので、数学的な質問はLinux板が良いです。 質問者の環境がLinuxなのかWindowsなのかも明らかじゃないのに
しきりにLinux板を薦めるのがメンヘラっぽくて怖いw ム板はバカの集まりなのでLinux板で聞いたほうが良いと教えてるだけ。
Windows10は関係ない。 元々犬板ってレベルが低い犬厨をUNIX板から隔離するためにできた板なんだけど 1行を3分割て1行ループ回すごとにスレッド読んでるなら遅くて当たり前な気がするけど
横3分割って意味なのかな 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使わずに最適化なんぞ出来る訳が無い ■ このスレッドは過去ログ倉庫に格納されています