X



【C++】高速化手法【SSE】2 [転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
0205デフォルトの名無しさん
垢版 |
2015/12/02(水) 23:16:28.02ID:rypJABRF
>>203
命令レベルの並列化にしろマルチプロセッサでの並列化にしろ
クリティカルパスじゃない部分を見つけて並列化してるという点では一緒で
並列化のアプローチの仕方が違ってるだけなのは理解してるんでしょ?
命令レベルの並列化であるOoOの方が直接的にクリティカルパスの影響を受けて
並列化が並列化が制限されるようになったからハイパースレッディングが投入されたのに
メイニーコアでクリティカルパスが問題になるって言い方は引っかかるんだよ
0206デフォルトの名無しさん
垢版 |
2015/12/03(木) 05:09:10.56ID:Yx1WEMuy
【 オンライン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
0208,,・´∀`・,,)っ-○○○
垢版 |
2015/12/03(木) 19:53:16.18ID:uwlB9z0+
さすがに[?]をエイと発音するのは苦しいぞ
実はmainie coreという架空世界のCPUの話をしているという可能性もあるけどな

学の無い語るに値しない人間なんだろう
0211デフォルトの名無しさん
垢版 |
2015/12/04(金) 00:59:55.26ID:vTE6A8P6
煽りじゃなくてぐうの音もでないような真実を突きつけてこそじゃねえかな
0214デフォルトの名無しさん
垢版 |
2015/12/04(金) 10:37:56.49ID:yGPPr8Zs
母国語英語、第二母国語C++と日本語な俺からするとMulti-をマルチって言うのも違和感あるけどな
0215デフォルトの名無しさん
垢版 |
2015/12/04(金) 18:14:24.01ID:3WaVS3Ju
やっぱりこの板の住民は英語でレスする方が楽な感じですか?
苦手過ぎる…
0219デフォルトの名無しさん
垢版 |
2016/05/01(日) 15:00:17.83ID:tKi6j9CT
匿名通信(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的に分散され、特定のサーバーに依存しません
0222デフォルトの名無しさん
垢版 |
2017/01/21(土) 13:23:31.22ID:dThE4/1u
なんかない?
0223デフォルトの名無しさん
垢版 |
2017/05/07(日) 23:05:11.98ID:8v4hzv7f
1次キャッシュに収まるスレッドを沢山作りたいとき、SSEやらAVX
のレジスタをメモリ代わりに使うのとメモリ直でアクセスするのとどっちが
キャッシュ乱さずに動くかな。
3次キャッシュは使いたくないし、2次キャッシュもスレッド切り替えだけに
消費させたいし。
0224デフォルトの名無しさん
垢版 |
2017/05/08(月) 00:55:10.37ID:BlZJ1Ed5
>>223
理論的にはレジスタを使うほうが乱さないだろうけど、
コンパイラやプロセッサがどうするかは動かしてみないと分からないだろうね。
0226デフォルトの名無しさん
垢版 |
2017/08/09(水) 20:56:25.64ID:+5xcelsT
1次キャッシュに収まるなら他のキャッシュなんて気にする必要は無いと思うんだが
普通のOSで普通のコードを動かすなら、スレッド切り替えによるオーバーヘッドなんて無視できるレベルだし

そんなことを心配するよりも、肝心なコードを気にしようよ
いろんなテクニックを知ってるからコードをアップしてくれれば、小さいループならお役にたてるかも知れない
0228デフォルトの名無しさん
垢版 |
2017/08/16(水) 16:38:15.04ID:caDabzDZ
最近ニコニコ動画に上がってる経済シミュ、生態シミュ動画の人の高速化手法がすごい
0230デフォルトの名無しさん
垢版 |
2017/09/13(水) 01:32:53.89ID:8Q2gNSiE
std::copyってsimd化などの最適化って既にされてるのかな?
sse_copy()とか自作したとして
効果は期待出来る?
0232デフォルトの名無しさん
垢版 |
2017/09/13(水) 02:20:34.07ID:TvE1YB9H
名前的に、SSEの128bitレジスタを使ってのコピーだろう

memcpyとmemmoveの違いはぐぐればすぐわかる
0233デフォルトの名無しさん
垢版 |
2017/09/13(水) 02:25:23.48ID:S8v0D06m
じゃなくて、自作しようとしているSSEでコピーするであろう「sse_copy」と
標準で用意されている「memcpy、memmove」←両方合わせて、とで
何が違うの?という話
当たり前だがmemcpyはCPUがSIMDに対応していれば使うし
カリカリにチューニングしてあるわけだが
sse_copyなど要るの?
0234デフォルトの名無しさん
垢版 |
2017/09/13(水) 02:48:41.88ID:8Q2gNSiE
memcpyはC言語の関数だったか
存在を忘れてた
こいつは最適化入ってるのね
これ使えば良さそうだ
そうする、どうもです
0236デフォルトの名無しさん
垢版 |
2017/09/13(水) 11:25:41.68ID:RHwHks/k
std::copy使っておけばPODならmemcpyかmemmove使うんじゃないの
VS2017のやつはmemmove使ってるな
0237デフォルトの名無しさん
垢版 |
2017/09/13(水) 15:04:16.35ID:xDYBj2Vm
copyrect
0238デフォルトの名無しさん
垢版 |
2017/09/13(水) 18:53:59.90ID:GrxKOJ+a
謎の速度低下で悩んでいたが、キャッシュレイアウトって重要だな。
AVX512で一部分だけ値更新したい時、16バイト読み込んでその位置に64バイト書き戻すようなケース。
そのまま16バイト読み込みで実装すると、読み込み時に16バイト分しかキャッシュがないので、書き込む時に64バイトに拡張というか再配置されて遅くなる。
最初から64バイトで読み出すと、サイズが変化しないので遅くならない。
ついつい、読み出し量が少ない方が速いに違いないと思い込んでしまう罠。
0239デフォルトの名無しさん
垢版 |
2017/09/13(水) 20:49:54.25ID:zEWQVEHs
パーシャルライトって奴だな
キャッシュにも有効なのか

昔のPenProの頃の8/16bitレジスタへの書き込み後の32bit読み出しとか
HDDが2T超える頃の4Kセクタのパーティションでの位置ずれとか
信じられないほど遅くなる要因になるもんな
0240デフォルトの名無しさん
垢版 |
2017/09/13(水) 21:31:13.89ID:y458W+jL
え、memcpy()とかstd::copy()ってSIMD使うん??
vectorのコピー遅いから困ってて、カリカリとSIMDで書こうかと思ってたんやけど、手間省けるわ。
0241デフォルトの名無しさん
垢版 |
2017/09/13(水) 21:45:57.88ID:FrHUdEqr
コピーが遅いから困っててと言うけれど
どうやって遅いと結論づけたのですか?
本来なら16ms完了するはずなのに29msもかかってしまっている!
とかわかるんですか?
0242デフォルトの名無しさん
垢版 |
2017/09/13(水) 21:55:49.49ID:y458W+jL
ああ、いえいえ、言い方が悪かったですが、
処理時間に占めるコピーの割合が増えてきたので、高速化したいなぁ、と思っただけです。
0243デフォルトの名無しさん
垢版 |
2017/09/14(木) 20:07:50.27ID:l0W4QyGB
rep movsbが糞速い
https://srad.jp/~miyuri/journal/569822/
>>REP MOVSはマイクロコードで実装されていて、最初にコピーサイズを見て適するコピーアルゴリズムを決めるセットアップ処理を行なってから
>>実際のコピー処理を始めるようになっている。そのため小さいサイズのコピーではセットアップ時間のオーバーヘッドが無視できないが
>>コピーサイズ(適度に大きいサイズ)とアラインメントの要件とプロセッサの世代の条件を満たすとそこそこの性能が出る。

>>プロセッサの世代によって展開されるマイクロプログラムが変わり最適化の度合いも変わってくると。
>>第1世代Core i以降のプロセッサのREP MOVSのマイクロコードは比較的速い。
デコード済みの命令をキャッシュ出来るようになったから、マイクロコード展開命令でも最適化が行われるようになってるみたいだよ。
0244デフォルトの名無しさん
垢版 |
2017/09/14(木) 21:12:13.74ID:AvPBQe63
メモリのレイテンシ、スループットやキャッシュサイズに依存するんだから
ブロック転送命令の最適化は無駄な努力だとインテルは思ってんだろう。
0245デフォルトの名無しさん
垢版 |
2017/09/14(木) 21:41:42.21ID:vjSz//mI
Visual Studio 2017 で
memcpyを調べてみた

x86は rep movs
x64は vmovups 128bit 2パラ16アンロール

オプションでAVX2命令を使うようにしてもかわらず

vmovaps 256bit/512bitの方が速いから
頻繁に使うなら自作した方が良い
0246デフォルトの名無しさん
垢版 |
2017/09/14(木) 23:27:05.22ID:l0W4QyGB
>>238
キャッシュ可な領域はキャッシュライン単位でDRAMの読み書きが行われるはずだから
キャッシュは関係ないでしょ。
0247デフォルトの名無しさん
垢版 |
2017/09/15(金) 00:42:48.43ID:SH+3EPbt
>>246
アライメントのほうだったかも。
境界跨いで更新する時、あらかじめ更新サイズで読み出しておけば、全領域使用可能状態になるが、読み出し半分だと残り分キャッシュ要求発生して遅くなると。
0248デフォルトの名無しさん
垢版 |
2017/09/16(土) 02:31:32.38ID:Y9EbWhOv
>>247
一定のストライドで読み込んでいれば自動プリフェッチで早めにキャッシュに取り込まれる可能性もあるけど、
DRAMの帯域を圧迫しないようにページ境界をまたいでは機能しないようになってるはずだったので、
AVX512のベクタ長だと、何サイクルか先のループで使うデータをプリフェッチで要求した方がいいかも。
0250デフォルトの名無しさん
垢版 |
2017/09/16(土) 17:07:26.32ID:EqmVZpne
>>249
一時は自動プリフェッチの性能が向上してあまりprefetchの意味がない状態が続いていたけど、
AVX512ともなると1ページ分のデータをループ64回で消費しちゃうんだよな…
DRAMのCASレイテンシをCPUクロックで換算すると結構長いからね。
0251デフォルトの名無しさん
垢版 |
2017/09/17(日) 15:21:48.39ID:ZiTBR472
え?AVX512は手書きprefetchのほうが性能出る?
これまではハードウェアプリフェッチが超優秀で、手書きprefetchはむしろオーバーヘッドになって遅くなる感じだったんだけど。
0252デフォルトの名無しさん
垢版 |
2017/12/10(日) 20:33:52.61ID:M5Qtf5Qu
prefetchはハードウェアにまかせて手書きでclflush入れるのが一番いい感じなんだけど。こんなケースは少数派なのかな。
0253デフォルトの名無しさん
垢版 |
2018/02/01(木) 08:35:26.88ID:VuVCHSR9
xeonでavx命令使うと過熱防止のため1ms間、動作クロック下げるなんて聞いてないよ〜(>∀<)
0255デフォルトの名無しさん
垢版 |
2018/02/16(金) 06:35:40.61ID:W1XJdyx1
☆ 日本の、改憲を行いましょう。現在、衆議員と参議院の
両院で、改憲議員が3分の2を超えております。
『憲法改正国民投票法』、でググってみてください。国会の発議は
すでに可能です。平和は勝ち取るものです。お願い致します。☆☆
0256デフォルトの名無しさん
垢版 |
2018/05/23(水) 20:32:42.01ID:Au5e7VGg
僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』

YF4RO
0261デフォルトの名無しさん
垢版 |
2018/06/09(土) 12:21:09.00ID:6JxGr/md
クロックが高いのが目的じゃなくて
処理が速いのが目的

その辺がよくわかってないアホがいるみたい
0266デフォルトの名無しさん
垢版 |
2018/06/13(水) 06:44:44.44ID:sIzYe/Rc
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)
0268デフォルトの名無しさん
垢版 |
2018/07/04(水) 22:24:56.45ID:gFgZc5FG
HHG
0270デフォルトの名無しさん
垢版 |
2018/07/12(木) 17:41:30.02ID:JTIrQoQb
そもそも4倍の量が同時に計算できるわけだから
クロックが半分になっても元は取れる
0274デフォルトの名無しさん
垢版 |
2018/10/24(水) 21:06:49.85ID:mVtKb6jM
これ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;
}
0275デフォルトの名無しさん
垢版 |
2018/10/24(水) 22:27:31.88ID:2t/OeFdE
そりゃ、やってることが違うんだから
同じにしたけりゃ sum2 で for (auto& p: v) にしてみ
0277デフォルトの名無しさん
垢版 |
2018/10/25(木) 11:47:46.18ID:5Cy/pQlU
結果も違うんじゃね
ちゃんと中身観たか
0278デフォルトの名無しさん
垢版 |
2018/10/25(木) 17:06:36.77ID:+VSq1LXv
結果は同じだろ? 鬼のように発生するコピーのためにメモリ不足で死なない限りは。
0280デフォルトの名無しさん
垢版 |
2018/10/25(木) 19:41:56.48ID:u+frCiwH
C++は、書いた通りに実行されるだけ。
高速な処理が必要なら、そう実行されるように実装しないと。
0282デフォルトの名無しさん
垢版 |
2018/10/26(金) 16:39:17.96ID:8hqqerJ0
vectorとか激しくコピーしすぎ
0285デフォルトの名無しさん
垢版 |
2019/11/09(土) 12:43:46.37ID:nG1HKTzx
push_backしまくってもそれほどパフォーマンスは悪化しないように出来てるはずだが
コピーしまくりっていうんだから関数で値渡ししてるとかじゃないか?

いずれにしろC++自体の問題ではない
0286デフォルトの名無しさん
垢版 |
2019/11/09(土) 12:46:29.28ID:nG1HKTzx
データの並び順やアルゴリズム、...
この辺がパフォーマンスに大きな影響を与える

コンパイラの最適化なんぞ知れてる
その辺を最適化したければガシガシアセンブラだが
その前にいくらでもやることがあるのが普通
0287デフォルトの名無しさん
垢版 |
2019/11/09(土) 12:48:19.04ID:nG1HKTzx
メインメモリが相対的に遅くなってきてるので
データの並びは非常に重要
大きなデータはディスクアクセスのような感覚で扱わないとダメ
0289デフォルトの名無しさん
垢版 |
2019/11/09(土) 21:44:34.74ID:GgGliPcL
突っ込みどころもあるが1年前のレスに真面目に返答してるおまえを評価する。
0290デフォルトの名無しさん
垢版 |
2019/11/10(日) 12:14:45.63ID:7BQWwZ6D
x おまえ
o おまえら

って書こうとしたが
同じ人だった orz
0292デフォルトの名無しさん
垢版 |
2019/11/11(月) 20:31:51.81ID:mj2unNmc
プログラムを高速化する話
https://www.slideshare.net/KMC_JP/ss-45855264

コンパイラでベクトル化されやすいコードの書き方
https://jp.xlsoft.com/documents/intel/compiler/17/for_17_win_lin/GUID-D284C1EE-BFA4-4EA3-BB67-4A3E5D50199F.html

Intel Intrinsics Guide
https://software.intel.com/sites/landingpage/IntrinsicsGuide/

メモリアクセスが相対的に遅くなってるってことは、人間が組み込み関数使って最適化すれば
別にアセンブラなんて使わなくてもいいってこと
それに、64bitではインラインアセンブラも使えないコンパイラがあるし、関数呼び出しや例外処理の
書き方も変わってしまっているので移植性が低いよ
0294デフォルトの名無しさん
垢版 |
2019/11/12(火) 13:18:01.61ID:TlWEsNqa
>>292
アセンブラを使わなくても速度チューニングネタはたくさんあるが
当然最後の手段としてはアセンブラは有効

小さいループに処理が集中してるような処理は
特に効果的

下手くそがアセンブラに手を出すと逆に遅くなったりもするけど
0296デフォルトの名無しさん
垢版 |
2019/11/13(水) 00:56:22.92ID:AZXdI1I6
>>295
>>286
>コンパイラの最適化なんぞ知れてる
>その辺を最適化したければガシガシアセンブラだが
とか書いてたから
この人10年くらい時間が止まってるよね
64bitと32bitじゃレジスタの数も違うし、SIMDの新命令に対応させるたびに
レジスタ割り付けが全く変わってしまうこともあるのにアセンブラって…
AVXなら3オペランドも使えるから、コンパイラに任せてもコードの質は低下しにくくなってるはず
0297デフォルトの名無しさん
垢版 |
2019/11/13(水) 10:22:08.98ID:EqcpRCSG
費用対効果を考えればIntrinsicsでも良いけど

究極の最適化はアセンブラしか無い
IACAを使ったり実測したりしながらパズルする

処理が非常に単純で速度の求められる小規模DSPなんかでも
いまだにそういう開発をする
0300デフォルトの名無しさん
垢版 |
2019/11/13(水) 13:05:36.17ID:EqcpRCSG
SIMDを覚えたての初心者はこんなコードを書きやすい
典型的な糞コード

ループ {
sum = _mm_add_ps(sum, data[i]);
}

>>299
そうです
0302デフォルトの名無しさん
垢版 |
2019/11/13(水) 13:21:58.53ID:FP2h74Sh
GPUユニットはCPUに乗っけたのだから後はFPGAも乗っけるだけ。
アルテラは既に買収済みだしな。
0304デフォルトの名無しさん
垢版 |
2019/11/13(水) 16:48:11.25ID:FP2h74Sh
スパコン分野じゃ固定の計算式はFPGAが一番効率的。そういう意味で地球シミュレータや京はゴミ。
スパコンが必要な分野でCPUのような汎用性などいらない。
0305デフォルトの名無しさん
垢版 |
2019/11/13(水) 17:02:40.99ID:EqcpRCSG
今度はスパコンが出て来たか
関わったこともないだろうに

スーパーコンピューターこそ汎用性が必要
ベクトルコンピューターが消えたのも
より汎用性を重視するから

スーパーコンピューターの世界でFPGAが求められてるなら
当然スーパーFPGAが流行ってないと辻褄が合わないわけだけど
流行ってないね
0306デフォルトの名無しさん
垢版 |
2019/11/13(水) 17:18:55.90ID:FP2h74Sh
何を言ってるからよく分からないなぁ。
特定の式を大量に速く計算したいという要望に対してなんで汎用性が出てくるの?
汎用性スパコンが1億なら同じ性能で1000万で達成できるんだよ。
しかも汎用性のために可用性が落ちるとか話にならないよ。京見れば分かるでしょ。
0307デフォルトの名無しさん
垢版 |
2019/11/13(水) 17:37:57.46ID:OceCV+VL
自分専用ならTSSにする必要もないしな
0308デフォルトの名無しさん
垢版 |
2019/11/13(水) 18:11:35.42ID:nB9KorLn
FPGAとかスーパーコンピューターとか自分専用とか
具体的な処理を何も語ってないのによくもまあ勝手に前提を作るよなあ

ここはソフトの最適化のスレなんだけど
0310デフォルトの名無しさん
垢版 |
2019/11/13(水) 18:26:47.86ID:FP2h74Sh
FPGAだってプログラムでコーディングするんだが・・・。勝手な前提作ってるのはおまえじゃん。
というかSSEでの高速化がOKなら、GPGPU、FPGAもOKだろう。
0312デフォルトの名無しさん
垢版 |
2019/11/13(水) 19:23:44.45ID:FP2h74Sh
1年もレスが無かった過疎スレになんでこんな必死な自治厨がいるのだろうw
前スレも10年かけて1スレ消費したんだぞw

おまえは何者だw
0315デフォルトの名無しさん
垢版 |
2019/11/13(水) 19:51:20.51ID:AZXdI1I6
>>312
前に64bitで絶対アドレス使えって書いて突っ込み受けたらファビョってたのいたでしょ
あれと同一人物っぽいんだよなあ
>究極の最適化はアセンブラしか無い
とか書くところとか

午後のこ〜だの開発者たちが動画コーデックの開発しなかったのだって、
MMXは除外しても、SSE2、SSE3、SSSE3、SSE4、SSE4.1、AVX、AVX2、AVX512に加えて、
64bitでは一気に種類が2倍と、次々と登場する新命令ごとに最速のルーチン用意していく手間と、
コードが異なるために特定のCPUでしか発現しないバグがでるリスクが増すこと考えたら、
最速に拘るのが現実的ではなくなったんだよ
彼らとしては妥協したコード書く気はなかっただろうし、興味が失せるのも仕方ないのかもね

AVISynthもインラインアセンブラ使ったプラグインだらけで64bit化に対応できずに放置されてたのが
相当あったけど、自分も64bit化やった経験からも、今更初心者にアセンブラ使えなんて教えんなと言いたい
0316デフォルトの名無しさん
垢版 |
2019/11/13(水) 20:53:55.20ID:Fqkv69gY
初心者ならIntrinsicsなんか使わないで素直に汎用性のあるC++で書くかライブラリを使えばいいよ

ここは高速化手法スレだから高速なコードであることは重要
Intrinsicsよりアセンブラの方が高速に書けるのは自明なのでアセンブラの話題は当然出てくる
0318デフォルトの名無しさん
垢版 |
2019/11/13(水) 21:12:18.74ID:Fqkv69gY
Intrinsicsで32bit/64bitの共通化は出来ても
新命令がでたらどうせ作り直しだよ

新命令に最適化しないならそのままでいいよ
「新命令対応」て謳うのが目的じゃなければ

SSEからAVXの移植もレーン縛りで苦労しただろ?
単純に置き換えなんて出来ない
128bitのまま単に3オペとレジスタ数だけなら簡単だけど

AVX512も同じ
マスクレジスタや新命令を使うなら書き直し
0319デフォルトの名無しさん
垢版 |
2019/11/13(水) 21:13:39.13ID:Fqkv69gY
アセンブラ狂信者じゃない
Intrinsicsも使う

極限な最適化にはアセンブラが必要ってだけ
まあ当然だ
0320デフォルトの名無しさん
垢版 |
2019/11/13(水) 21:19:04.07ID:Fqkv69gY
どうせ今後は32bit向けの最適化なんかやらんだろ
だとすると手間の差はレジスタ管理くらい
0321デフォルトの名無しさん
垢版 |
2019/11/13(水) 21:42:54.67ID:AZXdI1I6
>>320
>だとすると手間の差はレジスタ管理くらい
こんなこと書くようだと大したコードは書けないな
レジスタ割り付けの妙味と面倒さを知らないのなら、別に組み込み関数で書いても構わないだろ
0322デフォルトの名無しさん
垢版 |
2019/11/13(水) 22:04:42.12ID:RzCRvdkP
>>321
レジスタ割り付けの妙味www
さほど時間をかけなくてもコンパイラよりマシなのは作れるよ
そもそもIntrinsicsの時点でもレジスタ数削減は考えるべきであって
何も考えなきゃIntrinsicsだろうがアセンブラだろうが遅い
0324デフォルトの名無しさん
垢版 |
2019/11/13(水) 22:09:21.49ID:RzCRvdkP
SIMDの一番簡単とも思えるこんなコードでも
最適化に関して語れることは山ほどある
0325デフォルトの名無しさん
垢版 |
2019/11/13(水) 22:22:02.11ID:AZXdI1I6
>>322
やっぱこいつ絶対アドレス君だw
妙味の部分に草生やすってことは大したコード書いてない証拠みたいなもんだよ
コンパイラより1%速くなっただけでもドヤ顔するタイプだろ
0326デフォルトの名無しさん
垢版 |
2019/11/13(水) 22:38:51.61ID:RzCRvdkP
絶対アドレス?

一番アクセスが速いのはスタック
ほぼ確実にL1キャッシュにある
一等地
0329デフォルトの名無しさん
垢版 |
2019/11/14(木) 12:00:59.24ID:Owl20mAs
300 みたいなことはこのスレの本来の住民なら誰でも知ってるから
いちいち講釈垂れるのはスレの無駄遣いだからやらないだけ

FPGA だって互換性気にしなければオリジナルの CPU の IP 書けば済む話で
少なくともこの板でやる話ではない
0332デフォルトの名無しさん
垢版 |
2019/11/14(木) 16:17:09.42ID:23v5U+5B
>>315
>MMXは除外しても、SSE2、SSE3、SSSE3、SSE4、SSE4.1、AVX、AVX2、AVX512に加えて、
>64bitでは一気に種類が2倍と、次々と登場する新命令ごとに最速のルーチン用意していく手間と、

知らなくてもいいことかもしれないけど、これはアセンブラ作者泣かせでもあったりする。
命令数が多すぎるので手作業での入力は例えテーブル方式を採用していても無理が有り、
インストラクションセットの表を自動的にテーブルに変換するようなプログラムをしなくては
ならなくなってきている。
0333デフォルトの名無しさん
垢版 |
2019/11/14(木) 18:28:43.14ID:wXs4N2j2
>>300は非常に良い教材だよ
これだけで語れることは山ほどある
「誰でも知ってる」なんて言う人は
ほとんど何も知らない初心者だけ

>>332
全てのCPUに対して最適化したコードを書く人なんていないだろ
せいぜい128bit, 256bit, 512bit の3バージョンくらい
32bit 512bit なんていらんだろうし
マーケティング上の理由で作らされてる人がいるのか?
それなら御愁傷様

本当に最適化するなら対応命令だけじゃダメ
IceLakeはAVX512が遅いし
AMDも昔はAVXがとても遅い
0335デフォルトの名無しさん
垢版 |
2019/11/14(木) 19:18:18.01ID:wXs4N2j2
前半からアセンブリ言語での記述の話だと思ってしまった

命令数めちゃくちゃ多いよね
多いだけじゃなくて複雑にもなってる
{k1} とか {z} とか

まあそれでも(高級言語の)コンパイラを作るよりははるかに楽だろうけど
0336デフォルトの名無しさん
垢版 |
2019/11/14(木) 20:19:51.75ID:86Xe+wXL
>>326
前にアセンブラスレでこんなこと書いてた変なのがいたんだよ
>実際には問題がある。なぜなら、そんなにアドレスが大きいと、さっきから話題の
>mov   al, my_mojiretu[rbx]
>という命令が使えなくなるからだ。
とか、
>RIP相対32bitdispだとアクセスできない場合が出てくる
>シンボルがRIP相対2GBに制限されるなどはあくまでCコンパイラの制限であって
>アセンブラはその制限を受けない

ちょっと考えれば64bitなのに2GB制限するオプションとか使ってDLLも作れなくなるような
記法が推奨されてるはずないよな
それで複数の人から突っ込まれたら、誤りを認めて引っ込めばいいものを、
ファビョって連投しまくるから、皆呆れて無視したってことがあったんだよ

挙句にこんなことまで言い出したり
>自分は 64BIT 用C/C++コンパイラをインストールして無いので、試せません。
>>326だってこいつの言ってることはおかしいと思うだろ?
0340デフォルトの名無しさん
垢版 |
2019/11/14(木) 23:52:36.80ID:uioYVx5f
>>339
MSの人より頭が言いなんて、当たり前じゃない。
日本人をなめてはいけない。
0341デフォルトの名無しさん
垢版 |
2019/11/14(木) 23:54:38.25ID:uioYVx5f
純粋に技術競争になったら、日本は絶対にアメリカに勝つ。
いつもそうだったし、IT分野でもそう。
問題はアメリカ人は自分が負けそうになると、圧力をかけて壊してくることだ。
0343デフォルトの名無しさん
垢版 |
2019/11/15(金) 06:20:01.64ID:/dDy1LQy
>>336
そこだけ抜き出しても何が言いたいのかわかりません

スレタイとは関係なく
ただ人をバカにするためだけの書き込みなら
感心しない
0344デフォルトの名無しさん
垢版 |
2019/11/15(金) 07:39:37.60ID:6uJ1WeVS
>>342
そうそう
40〜50行程度の32bitSSEの自慢のコード片を晒せば大体の実力は判るんじゃないかな

でもね、自分が本気で最適化する時は、IACAの分析結果じゃいい加減すぎて役に立たないから
人力で計算してたんだよね
社外に秘密にしたいパイプラインの実装の詳細を気前よくツールに実装するはずないよね
だから、IACAを使って最適化してるのを自慢してる辺り、あまり期待はしてないけどね
0346デフォルトの名無しさん
垢版 |
2019/11/15(金) 08:13:55.97ID:pd2oXw5y
IACAの使い方間違ってないか?
自力で計算するための情報を手っ取り早く得る為の物だぞ
0348デフォルトの名無しさん
垢版 |
2019/11/15(金) 08:41:09.49ID:pd2oXw5y
>>344
40〜50行程度になる題材があればコードを書くよ

今更32bit SSEってのも
時代についていってない感じでイマイチだけど
最適化はその時代のCPU向けでいいのかな?
0351デフォルトの名無しさん
垢版 |
2019/11/15(金) 08:47:47.96ID:/yBuhf/V
量子コンピューターに日本人の名前がクレジットされる可能性は高い。
一方、○○互換のソフトウェアはほぼ100%が中国発。
一見欧州製のように見えてもほぼほぼ中国。
人工知能に中国人の名前がクレジットされる可能性は相当高い。
0353デフォルトの名無しさん
垢版 |
2019/11/15(金) 08:51:56.44ID:/yBuhf/V
おそらく世界最初の人工知能は春麗とかいう名前になる。
0354デフォルトの名無しさん
垢版 |
2019/11/15(金) 08:52:04.36ID:LE7NfU10
>>352
日本の平均レベルが低いからといって、このスレに来ている人全員のレベルが
低いことにはならないということだよ。
0355デフォルトの名無しさん
垢版 |
2019/11/15(金) 08:53:57.40ID:pd2oXw5y
日本とアメリカの技術力の比較の話から
なんで個人の能力に話をすり替える?
0356デフォルトの名無しさん
垢版 |
2019/11/15(金) 08:55:36.81ID:LE7NfU10
>>355
日本では、かつては半導体業界に優秀な人が集まっていた。
その当時、日本を引っ張っていたのは平均レベルの人達ではなかったんだよ。
自分の周りの平均以下のプログラマを見て、それが日本を代表するプログラマの
レベルだと思ってもらっては困る。
0357デフォルトの名無しさん
垢版 |
2019/11/15(金) 08:56:48.41ID:pd2oXw5y
しかも
勝てる人もいる
って

アメリカのトップに勝つ人がいるって言うなら多少の意味はあるけど
0358デフォルトの名無しさん
垢版 |
2019/11/15(金) 08:57:04.71ID:LE7NfU10
様は、生まれつきのIQや理解力や記憶力の話だ。
努力とかじゃない。純粋のそういうものを比較すれば、日本のTOP層は
MSのTOP層と互角に戦える。
0361デフォルトの名無しさん
垢版 |
2019/11/15(金) 09:00:00.74ID:pd2oXw5y
>>359
想像じゃなくて具体的に示してください

数学オリンピックって
俺も出たけどね

そんな高校生の遊びと技術力を同一視しないで
0362デフォルトの名無しさん
垢版 |
2019/11/15(金) 09:11:49.17ID:LE7NfU10
>>361
あなたは数学ヲタクなだけでプログラミングが出来ないから
生意気なことを言ってるのか?
0364デフォルトの名無しさん
垢版 |
2019/11/15(金) 09:13:29.93ID:LE7NfU10
本当に地数学オリンピックに出られるなら、プログラミングなんてアホみたいに
簡単なはずだ。嘘なんじゃないか。
0365デフォルトの名無しさん
垢版 |
2019/11/15(金) 09:14:45.79ID:LE7NfU10
>>363
プログラミングは勝負の世界ではなく、お金の世界だ。
金儲けの手段。数学がそんなに出来りゃ学者にでもなればいい。
コンピュータ系の教授なら簡単になれるはずだ。
0366デフォルトの名無しさん
垢版 |
2019/11/15(金) 09:17:17.89ID:LE7NfU10
勘違いしてる人がいるようだが、本当に数学オリンピックに出るような人は、
いろいろなことが出来て、プログラミングなんて簡単に出来てしまう。
実例で行けば語学も堪能で13ヶ国語がぺらぺら立ったりする人までいる。
実際、数学オリンピックに出られるような人は、自分でもそれが分かる。
何もかも簡単に理解できるのだ。
0367デフォルトの名無しさん
垢版 |
2019/11/15(金) 09:19:48.94ID:pd2oXw5y
単なる局所的な最適化、高速化

コーディング

ソフト開発

は全然違うから

>>365
じゃあ収入で勝負するか?
0370デフォルトの名無しさん
垢版 |
2019/11/15(金) 09:29:06.33ID:pd2oXw5y
数学の天才が本気で高速化したコード
興味があるなら素直にそういえば良いのに
0375デフォルトの名無しさん
垢版 |
2019/11/15(金) 09:41:11.47ID:LE7NfU10
>>374
掲示板書き込みは、頭を使わないので簡単に出来るので全然違う。
他の人が思ってるように検索して調べることもしてない。
記憶に頼って書いてるだけなので簡単。一人には高度に見えるかも
しれないが、頭は停止状態で書いている。掲示板書き込みは頭の休憩。
プログラミングの勝負などは脳のフル活動が必要になるので
絶対にしたくない。特に天才の脳はフル活動すると疲れる。凡人とは違う
かも知れない。
0376デフォルトの名無しさん
垢版 |
2019/11/15(金) 09:43:30.90ID:LE7NfU10
>>375
誤:記憶に頼って書いてるだけなので簡単。一人には高度に見えるかも
正:記憶に頼って書いてるだけなので簡単。一般人には高度に見えるかも

ちなみに誤字脱字が多いのも、頭を休めながらテキトーに書いているからだ。
長文だから必死に書いている事は無い。キーボードはスラスラ打てるから。
一般人には分からないだろう。
0377デフォルトの名無しさん
垢版 |
2019/11/15(金) 09:44:13.05ID:pd2oXw5y
数オリに幻想を抱いてるようじゃ
能力も知れてる

でもびっくりするくらい数学を知らない人もいるよね
自信満々でアップした行列の掛け算のコード
実は行列の掛け算を知らなくて掛け算になってないとか
0378デフォルトの名無しさん
垢版 |
2019/11/15(金) 09:48:27.12ID:LE7NfU10
>>377
数学オリンピックは、出るだけでも少なくとも東大や、東大の大学院に入るより
ずっと難しい。マイクロソフトに入社するよりも難しい。
ハーバードやMITよりもずっと難しい。
工学系の教授になるよりも難しい。
0381デフォルトの名無しさん
垢版 |
2019/11/15(金) 09:52:16.79ID:LE7NfU10
>>380
本当にそんなに頭がいいなら、どっかの教授にでもなったらいいでしょう。
こんなところで人を馬鹿にしてはいけません。
0383デフォルトの名無しさん
垢版 |
2019/11/15(金) 09:56:05.40ID:pd2oXw5y
まあなんでもいいや
話をスレタイに戻そうぜ

とりあえず天才の>>381
>>300のコードの問題点と修正コードをよろしくね
0384デフォルトの名無しさん
垢版 |
2019/11/15(金) 09:56:57.67ID:LE7NfU10
>>382
俺は虚言ではない。
俺が嘘をついていると思ってるから、嘘で対抗しているの?
それは間違い。
0385デフォルトの名無しさん
垢版 |
2019/11/15(金) 09:58:10.18ID:LE7NfU10
>>383
SIMD命令には詳しく無いので、検索して調べないといけないのでやりません。
ここは頭を休める場所として使っているので、頭を使うことは出来ないのです。
0386デフォルトの名無しさん
垢版 |
2019/11/15(金) 10:00:55.84ID:LE7NfU10
実は、高IQ者が休憩時間に簡単なおしゃべりのつもりで言っていることが、
一般人には、高度すぎて勝負をしてきていると思ったりする可能性があります。
こういうことでギフテッドは一般の学校でトラブルになり易いのです。
本人は勝負のつもりではなく、とても簡単に言っているのです。一般人は、
勝負だと受け止めます。これが軋轢になるのです。
0387デフォルトの名無しさん
垢版 |
2019/11/15(金) 10:02:08.40ID:pd2oXw5y
じゃあ何に詳しいんだ?

別に頭を使うようなコードでもないけどねえ
単なる知識の問題
考慮すべき内容は大きく分けて5個
0390デフォルトの名無しさん
垢版 |
2019/11/15(金) 20:23:52.61ID:lI+7MgeJ
マウンティング合戦で過疎スレを伸ばさないでくれよ。
質問攻めして相手の揚げ足取りって馬鹿左翼みたいだし。

ループ {
sum = _mm_add_ps(sum, data[i]);
}

について語れるなら結論だけ書いてOKだよ。
0392デフォルトの名無しさん
垢版 |
2019/11/16(土) 11:20:10.45ID:lV5RucvD
・レイテンシとスループット
・メモリ帯域
・CPUと搭載命令
・演算の順番と精度
・処理の構成

SIMDの一番簡単とも思えるこのコードで
このくらい語れることはある
0394デフォルトの名無しさん
垢版 |
2019/11/16(土) 11:31:47.92ID:lV5RucvD
・レイテンシとスループット
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をレジスタに割り当ててくれることが期待できる
(一応確認する)
0395デフォルトの名無しさん
垢版 |
2019/11/16(土) 11:48:37.57ID:lV5RucvD
・メモリ帯域 / 処理の構成
このコードの性能が生かせるのは、
データがL1にある場合

メインメモリは非常に遅いので
大きなデータにこのループを使うと
ほとんど待ち時間になってしまう
(HTTなら他方のスレッドが動き放題)

小さなデータで頻繁に呼ばれるのであれば意味があるが(例えば低レイテンシが要求されるオーディオ処理)
大きなデータの場合はほとんどがメモリアクセス時間になってしまう

L1やL2に入るようにこまめにサイズを区切りながら処理をするとか
他の処理も合わせてループにすれば
メインメモリの帯域による性能劣化を減らす事が出来る

なのでこのループ自体の存在をまずは疑問視しよう
0396デフォルトの名無しさん
垢版 |
2019/11/16(土) 11:59:07.97ID:lV5RucvD
・CPUと搭載命令
128bit命令は古い
パフォーマンスが重要であれば
より性能のある256bit命令、512bit命令を使う
その為に、搭載命令を判別すること

・アラインメントと端数処理
メモリはキャッシュ境界をまたがない場合に性能が出る
今回の場合はデータが1個なので
前側端数と後側端数をゆっくり処理して
それ以外を高速なコードで処理をする

・演算順と演算精度
演算の順番で精度が悪化することがあるので注意
今回のコードは順番に足していくが
これは精度が悪化する順番である
(2^24個を超える個数の1を加え続ける事を考えると分かりやすい)
0400デフォルトの名無しさん
垢版 |
2019/11/16(土) 16:08:28.47ID:+CnVgCxY
>>397
なるほどね。かなり勉強になりました。
こんだけ簡潔に日本語で説明されているものは、そう簡単には
ネット検索では見つけられないんじゃないかと思います。
SIMD命令には詳しく有りませんが、ちゃんとレイテンシのことまで
考えないと真価を発揮できないようですね。
知りませんけど、Intelコンパイラでもここまでは自動最適化で
やってくれないかもしれませんね。実際どうなのかお聞きしてみたいものですが。

実はコンパイラの最適化というものは、コンパイラ作者自身はやりたいと思っていても、
実際にコンピュータに自動的にやらせるのは結構大変なものなのです。
細かな注意点が沢山あるためです。最大の問題は、レジスタが無限に
あるわけではないことと、特定のレジスタにしか対応していないマシン語が
あることから来ます。もう一つは、さまざまな型やサイズの変数があるために、
色々なパターンに対応するのが難しいことにあります。
そういうこととに加えてレイテンシの自動配慮などを行おうとすると、最適化を
自動的に行うコードは非常に複雑で膨大な量になるのです。
また、今のCPUには、レジスタは16本くらいと結構沢山有るので、レジスタが不足した
場合の処理は、滅多にテストできません。そのため、その最適化処理はなかなか
テストできないのです。ですので、生半可なテストでは間違いが含まれていても
分からないままコンパイラを出荷してしまう事がありえます。敢えてレジスタが3本しか
使えないようにした状態でコンパイラをテストしたりする方法も一つの手です。
または、テストを余りしなくても明らかに正しいことが分かるようにコーディングする
ことです。しかし、それは余り簡単なことでは有りません。
0401デフォルトの名無しさん
垢版 |
2019/11/16(土) 16:18:37.52ID:+CnVgCxY
>>400
最適化に関して。
例えば、最適化は、色々なパターンの最適化をどのような順序で施すかによって、
最終コードの質が変わってくることがあります。というのは、人間にとっては
割と大丈夫なのですが、コンパイラにとっては、非常に複雑でそれ以上最適化
できないようなコードに見える状態に陥ってしまうことがあるからです。
普通は、少しずつ良いコードになるよな修正を何度も何度も繰り返して、それ以上
良いコードになる方法が分からなくなった時点で最適化が終わります。
ところが、いったん、悪いコードにしてから、もう一度最適化をしてみると、
最後のコードは良いコードになる場合があります。このような最適化は人間には
余り難しくないのですが、コンパイラにとっては大変なのです。
なぜなら、悪いコードになってもいい事を許しだすと、オセロの先読みの min, max
方の様な試行錯誤型の人工知能的なものが必要になるのですが、そのような最適化は、
普段は余り効果を発揮しにくいのに、処理時間が膨大になるためです。
人間は、一度最適化したコードは、何年もそのまま使います。ところが、コンパイラは、
10分に一度くらいは、ビルドし直します。ですので、最適化にかけられる時間が違うのです。
CPUが人間より速くても、このような事情があるので、人間より良いコードを出すのは
案外難しいのです。
0402デフォルトの名無しさん
垢版 |
2019/11/16(土) 17:14:42.25ID:XECBqAmz
長いんだよ
0404デフォルトの名無しさん
垢版 |
2019/11/16(土) 22:40:57.80ID:moAaFJrn
アルゴリズムの最適化なら組み込み関数でもできる
なのに、アセンブラを使う理由があるのかって話なのに、なんで組み込み関数のサンプルなんだ?
自慢のコード片ってのは、アセンブラで書いたのに決まってるでしょ
言い争いしてたどっちが>>316なんだ?
0405デフォルトの名無しさん
垢版 |
2019/11/17(日) 08:46:55.15ID:Mp5WsRX6
「究極の最適化はアセンブラしかない」
これに反対する人はいないよな?
SIMDの高速化でIntrinsicsに対しての話

アルゴリズムの最適化?
そんなものIntrinsicsを使う必要すら無い
0406デフォルトの名無しさん
垢版 |
2019/11/17(日) 08:53:33.84ID:Mp5WsRX6
実際の開発現場では
(アセンブラではなくて)Intrinsicsを使うことが多い
これも別に誰も反対していない
0408デフォルトの名無しさん
垢版 |
2019/11/17(日) 12:07:44.77ID:254DddZo
>>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化出来ずにいる)
0409デフォルトの名無しさん
垢版 |
2019/11/17(日) 12:23:27.78ID:9epihDl/
>>408
横からだけど、最後の方はわかるけどコンパイラオプションのは組み込み関係ないし
単一の浮動小数点演算をSSEのレジスタ使うだけっしょ
あとハードの制約を外すんならSSEだのAVXだの選択肢に入らんでしょ
一般のPCにみんなついてるGPUだって使えるんだから

CPUの拡張命令を使うのはそれなりにハードの制約があるからだ
0412デフォルトの名無しさん
垢版 |
2019/11/17(日) 15:39:11.30ID:254DddZo
>>409
64bitはコンパイラオプションではなかったけど、わざわざ各バージョン向けのコードを用意しなくても
開発環境でまとめてビルドできるでしょ

>>410
たかがアセンブリで書いたくらいで「究極」なんてドヤ顔すんなってこと
頭のいいGoogleの人達は専用プロセッサを開発する選択をした

そこまで自信があるのなら、40〜50行程度の32bitSSEのアセンブリで書かれた自慢のコード片を晒してみたら?
0414デフォルトの名無しさん
垢版 |
2019/11/17(日) 21:03:25.34ID:254DddZo
>>413
「弘法筆を選ばず」って諺があるように、本当に才能のある人はわざわざ手段限定してドヤ顔したりしないだろ
せこいマウント合戦繰り広げてたの見てると、器の小ささを感じてしまうんだよな
そんなの恥ずかしいから止めとけよ
それより、エレガントなコード片晒した方がかっこいいぞ
0415デフォルトの名無しさん
垢版 |
2019/11/18(月) 07:47:56.01ID:3AU+PcKz
Intelは、何年も前からパラレル・ユニバースってキャッチフレーズで細粒度のマルチスレッディングを
推進していて、Threading Building Block(TBB)とかOpenMPなんかを使って並列化で速度を稼げと言ってる
現在では、IntelのIPPやMKLもフリー化されて、定番の処理は予め用意されてる

動画処理なんかでも、フィルタやフレーム別に複数のバッファを用意してマルチスレッド化してると
スループットを稼ぐようになってるので、最適化が甘くてもハイパースレッディングで実行ユニットは埋められる

GPUで計算する場合はライブラリ呼び出しだし、64bitでインラインアセンブラを使えるIntelのコンパイラは
700ドル以上するし、GCCのasmは癖が強すぎてMASMやNASMへの移植の障害になるほど

そういうことで、現在では「アセンブリで究極の最適化」なんて、時代に取り残された年寄りの妄言みたいな
状態になってるから、組み込み関数使って保守性をよくしておけばいい
0419デフォルトの名無しさん
垢版 |
2019/11/19(火) 03:23:02.67ID:MyJ9nvLK
>>417
NetBurstと違って、スパコンの主流が数千から数十万コア以上の超並列マシンになって
そろそろ20年近く経つのに、まだこんなこと言ってるのがいるんだな
よくまあ、これで最適化を語ってたものだ
0420デフォルトの名無しさん
垢版 |
2019/11/19(火) 06:56:46.21ID:MyJ9nvLK
なんでPen4なんかを持ち出すのか引っかかってたけど、もしかしてNehalem以降のCPUで
ハイパースレッディングが復活してるのも知らなかったとか?
>>286>>287
>コンパイラの最適化なんぞ知れてる
>その辺を最適化したければガシガシアセンブラだが
とか書いてたのがおかしいと思ったんだよな
シングルスレッドでしか動かないCPUなんかで、
HaswellやSkylake、IceLakeみたいな実行部の強化をするはずないだろ

OpenMPやTBBでマルチスレッド化すればベクタ化は組み込み関数でも十分だし、
メモリアクセスがネックになってるのに、どうしてマルチスレッドによる並列化に言及しないのか不思議だったんだよな
0421デフォルトの名無しさん
垢版 |
2019/11/19(火) 13:17:00.58ID:lt+0x6jo
スレッド分けももちろん重要です
まあ安直にOpenMPでも良いんですが
これも究極はスクラッチ

スーパーコンピューターと違って
普通のPCだとせいぜいHTTとマルチコアなので
まあそれほど複雑ではないですが

>>300の例だと、
演算ポートもロードポートもガラガラなので
HTTは非常に有効です
データがL1にあれば性能はほぼ倍になります
一方>>394の場合は演算ポートもロードポートもフルに使ってるので、
HTTの効果はありません
汎用整数命令や整数ベクタを使うスレッドに分けてあげましょう

まとまった単純な処理でHTTの効果が大きい物は
ポートがスカスカな糞コードですね

メモリ帯域で大きく性能が変わるコードも糞コード
これは>>395の通り
0423デフォルトの名無しさん
垢版 |
2019/11/19(火) 16:25:51.48ID:8/4AEaZj
> NetBurstと違って、スパコンの主流が数千から数十万コア以上の超並列マシンになってそろそろ20年近く経つ

というかこの人は何を言ってるのだろう。
スパコンなんて40年以上前から並列処理の性能ということも知らんとかまだ子供か学生かな?
当時のPen4のことも全然知らないんじゃないだろうか。NetBurstとスパコン比べて何が言いたかったのだろう。
0424デフォルトの名無しさん
垢版 |
2020/03/19(木) 23:46:19.85ID:sn82uzw4
ちょいとメンテがてらにmasm弄ってるんだけど、
mov r/m64, imm32 形式のバイナリ吐かせる記述方法がわからん。
0425デフォルトの名無しさん
垢版 |
2020/03/20(金) 00:09:21.01ID:/yJp+267
自己レスになるが、符号付き与えると符号拡張されるようだった
mov rax, -1
↓これと同じ結果
mov rax, 0FFFFFFFFFFFFFFFFh

VS2019だと
return 0xFFFFFFFFFFFFFFFF;
これが最適化されてコンパクトになっていたという話。やっぱアセンブラめんどい。
0426デフォルトの名無しさん
垢版 |
2020/03/25(水) 00:15:18.17ID:JuA9otrT
ICC 19.1って32bitで最適化してビルドすると、コード生成の拡張命令でSSE2やAVX未満を指定してもAVXのコード吐き出す事がある謎の仕様があって困る。というかたぶんバグ。
できあがったコードに正常でない無効なオペランドが含まれたり要はぶっ壊れてる。
これを回避するには、最適化 /Od 無効で任意の拡張命令を指定するとAVXが含まれずに正常なコードになるが、最適化はたぶんされていないだろうな・・・。
古い環境作ってレガシー用のビルド環境まだ要るんかなあ。
0428デフォルトの名無しさん
垢版 |
2020/03/25(水) 12:40:22.26ID:BJmxk7sc
さすがにバグレポート送るべき
再現できるコードとその時のオプションを添えて

とはいえ、既に世界の誰かが同じことをやっている可能性は大
0429426
垢版 |
2020/03/25(水) 15:55:42.99ID:JuA9otrT
謎のAVX出力は_mulx_u32が原因だった。
てっきりただの乗算と思いきや、これBMI2つまりAVX2の命令セット世代なんですね。
おそらくベクトル化を試みるかをした時、コンパイラ内部の命令セットのフラグがAVX2に上書きされて処理がおかしくなっていると予想。

今回の問題が無かったにせよ、非AVX2環境では動かないコードになっていたので自分のバグでもあるが、普通に動く場合もあるので注意がいる。
0431デフォルトの名無しさん
垢版 |
2020/07/11(土) 10:55:26.06ID:J0INoyBc
まあそうだね
0433デフォルトの名無しさん
垢版 |
2020/07/11(土) 19:00:18.09ID:zVc8luVQ
人によるな
わいの場合99%はCPUやOS、コンパイラのバグだな
0435デフォルトの名無しさん
垢版 |
2020/09/04(金) 00:13:07.71ID:951pQYyb
レイトレでOpenMP使ったら早くなるかと試したけど却って遅くなった
各ピクセルの演算には特に共有するコンテキストとかあるわけじゃないのに
変に安全装置が働いているんだろうか?
0436デフォルトの名無しさん
垢版 |
2020/09/04(金) 00:21:44.94ID:Znx8nm1Y
>>435
OpenMPはオーバーヘッドが大きいから細粒度の並列化には不向きだよ。
CPUでやるなら、せめてSIMD。
0437デフォルトの名無しさん
垢版 |
2020/09/04(金) 07:24:05.99ID:iEv5UTAi
細粒度もなにも、OpenMPはもともと4並列とか8並列とかコア数に合わせてやるもんだろう。
まさかピクセル数分だけ並列化すると思ってるのか?
0439デフォルトの名無しさん
垢版 |
2020/09/04(金) 11:59:04.83ID:eJvaiWE4
chinebenchなんかもレイトレだけど普通にコア数分早くなるでしょ
設計がまずいだけじゃないの
0440デフォルトの名無しさん
垢版 |
2020/09/06(日) 08:40:00.70ID:bVBmADbq
自作erレベルじゃなくム板なのでコード見てもう少し深く原因を解析してくれ。
0441デフォルトの名無しさん
垢版 |
2020/09/06(日) 10:34:43.20ID:q0H7dLCO
エリアで処理範囲分けるべきとこをほんとに1ピクセルずつ計算させてんのかな
0442デフォルトの名無しさん
垢版 |
2020/09/06(日) 19:16:49.00ID:yqdZF37w
どう解析したらいいかがわからない
とりあえずThreadPool使って1行を3分割して3スレッドで描画
3つのスレッドのタスクが完了するまで待機
って感じのことをやってみたらOpenMPでやったのと同じような程度で
処理速度が劣化した
(毎行描画ごとにSDLに制御を返してる)
0443デフォルトの名無しさん
垢版 |
2020/09/06(日) 19:19:09.98ID:yqdZF37w
SIMDも気になるけど知識がないから時間かかりそう
0445デフォルトの名無しさん
垢版 |
2020/09/06(日) 20:49:56.85ID:PyqKwzZq
そういうのは、ム板よりLinux板のほうが詳しいんじゃないだろか。
0446デフォルトの名無しさん
垢版 |
2020/09/06(日) 20:50:44.81ID:PyqKwzZq
レイトレあたりになると数学が関わってくるので、Linux板で聞いたほうが良いと思う。
0448デフォルトの名無しさん
垢版 |
2020/09/06(日) 21:02:03.50ID:PyqKwzZq
SIGGRAPHで発表されたばかりの先端的アルゴリズムなら、ここで質問するよりMAC板で聞いたほうが良い。

あるいは、先端アルゴリズムの数学的な部分についてはLinux板も詳しい。

MAC板は、人工頭脳を使ったグラフィック表現なども研究してるので、世界で通用すると思う。
0449デフォルトの名無しさん
垢版 |
2020/09/06(日) 21:19:36.31ID:gGwX7R3F
3スレッドでやっても時間が変わらなかったという時点で何かポカしているんだと思うが、
じゃあレンダリングするピクセル数を減らしたらそれに比例して時間が短縮するだろうか。
0450デフォルトの名無しさん
垢版 |
2020/09/06(日) 21:28:21.32ID:PyqKwzZq
そういうのはLinux板で聞けば。
0453デフォルトの名無しさん
垢版 |
2020/09/06(日) 22:25:50.00ID:PyqKwzZq
ム板は基本がおろそかなので、数学的な質問はLinux板が良いです。
0454デフォルトの名無しさん
垢版 |
2020/09/06(日) 22:34:12.06ID:gGwX7R3F
質問者の環境がLinuxなのかWindowsなのかも明らかじゃないのに
しきりにLinux板を薦めるのがメンヘラっぽくて怖いw
0455デフォルトの名無しさん
垢版 |
2020/09/06(日) 23:25:15.48ID:PyqKwzZq
ム板はバカの集まりなのでLinux板で聞いたほうが良いと教えてるだけ。
Windows10は関係ない。
0456デフォルトの名無しさん
垢版 |
2020/09/07(月) 10:28:57.49ID:syrYBlXo
元々犬板ってレベルが低い犬厨をUNIX板から隔離するためにできた板なんだけど
0458デフォルトの名無しさん
垢版 |
2020/09/07(月) 17:58:53.90ID:vcUD6VhW
1行を3分割て1行ループ回すごとにスレッド読んでるなら遅くて当たり前な気がするけど
横3分割って意味なのかな
0459デフォルトの名無しさん
垢版 |
2020/09/07(月) 18:25:16.84ID:b75Xf7nO
SIMDなんて-O3付けとけば自動で行われるじゃん。
それ以上は考えるだけ無駄でしょ。
0460デフォルトの名無しさん
垢版 |
2020/09/13(日) 20:11:59.25ID:zYAXQUsK
>>435、ディレクティブ(#pragma omp〜)、コンパイラバージョン、環境変数OMP_NUM_THREADS、実行環境のCore/Threadsはどんなの?
0461デフォルトの名無しさん
垢版 |
2020/09/14(月) 01:56:59.78ID:5Y5z53c+
>>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);
}
0462デフォルトの名無しさん
垢版 |
2020/09/14(月) 02:02:22.29ID:5Y5z53c+
parallel_for: 誤
parallel for: 正
0463デフォルトの名無しさん
垢版 |
2020/09/14(月) 02:42:30.59ID:5Y5z53c+
スレッド数も1〜4でいろいろ変えてみたら
1スレッド:一番早い
2スレッド:最悪
3スレッド:2スレよりマシ
4スレッド:3スレよりマシだけど1スレより遅い。CPU使用率100%に張り付く。
みたいな感じだった
0465デフォルトの名無しさん
垢版 |
2020/09/14(月) 07:57:55.59ID:Psg3/81m
もしスレッドプールが使われていないんだったら外側のyループで並列化するのがいいんだろうな。
0466デフォルトの名無しさん
垢版 |
2020/09/14(月) 11:24:08.29ID:5Y5z53c+
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
0467デフォルトの名無しさん
垢版 |
2020/09/14(月) 12:11:30.32ID:tgbt1xqp
実行時のコアの負荷どうなってるのかと
コンパイルオプションでopenmp有効にしてるの?
してるんだったらループ内の排他制御周りで時間食ってんじゃないの
0468デフォルトの名無しさん
垢版 |
2020/09/14(月) 12:20:38.35ID:tgbt1xqp
あとマルチスレッドにしてる部分で大量のメモリ確保とかファイルの読み書きとかしてないよね?
0469デフォルトの名無しさん
垢版 |
2020/09/14(月) 12:23:55.08ID:5Y5z53c+
スレッド数に応じてCPU使用率は上がってる
排他制御は不要だからしてない
0470デフォルトの名無しさん
垢版 |
2020/09/14(月) 12:32:30.05ID:5Y5z53c+
マルチスレッドにしてる部分は純粋な計算のみで結果を配列に書き込んでるだけ
0471デフォルトの名無しさん
垢版 |
2020/09/14(月) 12:44:52.40ID:tgbt1xqp
あとはxじゃなくてyのループをpararellにするぐらいしかないんじゃね
スレッド呼び出しの回数多くなってるでしょそれ
1行0.8秒もかかるならスレッドのコストあんま関係ないような気もするけど
俺に思いつくのはApplyresultがなにかしてんのかなってぐらい
0473デフォルトの名無しさん
垢版 |
2020/09/14(月) 12:55:20.98ID:5Y5z53c+
もともと外側ループに#pragma ompつけてたけどそれも遅かった(1スレッドに比べて)
Applyresultは画面に結果を表示させる(バッファ入れ替え)だけで
処理時間は0.01秒もかからない
0474デフォルトの名無しさん
垢版 |
2020/09/14(月) 13:00:39.33ID:tgbt1xqp
画面表示は別スレッドにすべきだと思うが
バッファ入れ替えのみで別スレッドで描画させてるなら多分問題ないけど
あとは暗黙のコピーでもどっか発生してるのかね
vsのopen mpだとデフォでスレッドプールしてるっぽいけどgccどうなんだろ
0475デフォルトの名無しさん
垢版 |
2020/09/14(月) 13:04:20.42ID:5Y5z53c+
あーコピーは有り得そうだなぁ
0476デフォルトの名無しさん
垢版 |
2020/09/14(月) 13:41:47.43ID:5Y5z53c+
ラムダ式にthisをキャプチャしても単なるポインタのコピーだけだよね
うーんもうあきらめようかな
0478デフォルトの名無しさん
垢版 |
2020/09/14(月) 14:31:35.53ID:lDodbDrd
> 1スレッド:一番早い
> 2スレッド:最悪
> 3スレッド:2スレよりマシ
> 4スレッド:3スレよりマシだけど1スレより遅い。CPU使用率100%に張り付く。

これで結論は出てる。同期コストを見積もれない馬鹿は並列化すんなってこと。
0479デフォルトの名無しさん
垢版 |
2020/09/14(月) 14:31:55.00ID:5Y5z53c+
スレッドで動かすタスクの単位がデカすぎてキャッシュに乗りきらなかった可能性ですかね
ありえそう
0480デフォルトの名無しさん
垢版 |
2020/09/14(月) 14:50:37.02ID:5Y5z53c+
同期コストに目をつけるのが的外れってことはわかる
0481デフォルトの名無しさん
垢版 |
2020/09/14(月) 15:07:54.11ID:lDodbDrd
まだその小学生の理科の実験みたいな分析を続けるのはいかがなものか。ここはム板である。
答えはコードに書いてある。夏休みの宿題じゃないから答えを見ていい。
結果とコードがあるから後はそれを理解する脳みそが足りてるかどうかだけ。

>>480
結論は出たな。キミにはこのスレはまだ早い。並列化=同期。基礎知識が全く足りてない。
コードを見てコストが読めない人が一体なにを最適化するのだ。
キミのやってることはPCパーツをとっかえひっかえしてベンチ走らす自作マニアと同じだ。
0482デフォルトの名無しさん
垢版 |
2020/09/14(月) 15:24:00.24ID:5Y5z53c+
よくしゃべる無能だな
0484デフォルトの名無しさん
垢版 |
2020/09/14(月) 15:32:26.78ID:5Y5z53c+
同期コストもなにも共有するリソースないし
お前みたいな雑魚に話しかけてねえよ
0485デフォルトの名無しさん
垢版 |
2020/09/14(月) 15:39:22.64ID:5Y5z53c+
メモリは余裕ありますね
>>477
に載ってる内容で今週末くらいに確認してみます
0486デフォルトの名無しさん
垢版 |
2020/09/14(月) 20:40:46.18ID:WpcYzJ76
>>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%)
0489デフォルトの名無しさん
垢版 |
2020/09/15(火) 07:39:41.08ID:AdrM302u
ここは昔から機械語レベルの最適化スレなんだが、
そういう丸投げ系の上流の話はスレ分けたほうがよくないか。バイナリは見る気ないんだろ?
0491デフォルトの名無しさん
垢版 |
2020/09/18(金) 14:56:14.26ID:O98b4bbM
       ,、‐ " ̄:::゙:丶、
    ,r::::l3゙::::::::/ハヽ:ヽ::::、:ヽ
    {::://:::::::// ヽ\ト、:::::::!
    ヾ l:::::::/ 丶   `ヾ ィ、:::|
     |;:r::|  O`  'O ゙ハ|   < ここ初心者がくるところじゃないから
      ヽハ :.:.    :.: レ
        ´\ r‐--‐、,ノ
 r、     r、/ヾ ̄下ヘ
 ヽヾ 三 |:l1、_ヽ/__ .ィヽ
  \>ヽ/ |` }    n_n| |
   ヘ lノ `'ソ     l゚ω゚| |
    /´  /      ̄|. |
0493デフォルトの名無しさん
垢版 |
2020/10/02(金) 14:52:54.88ID:R9hS5H3t
>>492
そう思うなら思い当たる原因とか教えてあげたら?
一言言うだけだよ
0494デフォルトの名無しさん
垢版 |
2020/10/02(金) 15:13:27.56ID:R9hS5H3t
それすらできないと本当に馬鹿なのがどっちか疑われても仕方ない
0500デフォルトの名無しさん
垢版 |
2020/10/02(金) 18:21:05.73ID:OFlYu8W1
>>493
何の切り分けもしてない頓珍漢な結果ではなく全コード出しなよ。ここム板だよ?
アセンブラわかりませんとか、自分で書いたC++コードがどういうバイナリ吐くか想像もできないとか、
最適化、高速化スレでは話にならないんだけど初心者プログラマ君。
0502デフォルトの名無しさん
垢版 |
2020/10/03(土) 09:40:53.11ID:F7oAx4CC
餓鬼に餌を与えないでください
0503デフォルトの名無しさん
垢版 |
2020/10/09(金) 19:32:19.84ID:6ayaX4HS
>>488
コア内のキャッシュがコンフリクトしまくっていると予想
ハイパースレッディングをoffにして2スレッドにしたらいいと予想
0504デフォルトの名無しさん
垢版 |
2020/10/09(金) 19:56:21.81ID:zHpvTSgq
HTが何か分かってないレベルでマルチスレッドにしたら遅くなったとか入門者スレでやれよ。
0507デフォルトの名無しさん
垢版 |
2022/04/21(木) 11:21:49.16ID:uYH/mfeQ
基本無料やぞ
というかvtune使わずに最適化なんぞ出来る訳が無い
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況