【C++】高速化手法【SSE】2 [転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
C++やインラインアセンブラ、SSEなどによる高速化の手法
について語りましょう。
前スレ
【C++】高速化手法【SSE】
http://peace.2ch.net/test/read.cgi/tech/1130349336/ 組み込み関数で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の一番簡単とも思えるこのコードで
このくらい語れることはある ■ このスレッドは過去ログ倉庫に格納されています