X



【C++】高速化手法【SSE】2 [転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
0003デフォルトの名無しさん
垢版 |
2015/05/21(木) 02:00:37.40ID:ZhKmhhGS
1スレ10年も掛かったのかwww

compiler intrinsicsの普及と、x64ではインラインアセンブラが使えなくなったのが
またSIMDの再普及に繋がる気がする

SSE3、SSE4、AVX、AVX2、FMAと言った新しい命令も増えているのも理由の一つか
0007デフォルトの名無しさん
垢版 |
2015/05/21(木) 13:51:48.66ID:Jx6BJl3J
マルチコアによるマルチスレッド化の方がずっと楽だから、難しいSIMDプログラミングはいまいち
はやらないのかな
0008デフォルトの名無しさん
垢版 |
2015/05/21(木) 19:18:14.97ID:taVQHAdz
SIMDは作るのは難しいが、一度作ってしまうと、関数の中に封じ込めることが出来るので、
後からの使い勝手自体はマルチスレッドよりも良いんだがな。ライブラリ化もただの関数なので問題ない。
マルチスレッドだと関数の中だけで閉じなくて、アプリ全体の設計の部分まで話が広がるので、
機能単位でライブラリ化するのが難しく、簡単に使いまわせない。
ま、SIMDはライブラリ化しやすいから、多くのものが既にライブラリ化されてて、
ほとんどの人はそれを使うだけですむので、自分で書く必要性が少なくて、
故に過疎りやすいってのもあると思うがね。
0009デフォルトの名無しさん
垢版 |
2015/05/21(木) 19:30:58.21ID:Ao5A+4wF
SIMD化はコンパイラに任せるのが得策。
アルゴリズム改善がどこもできなくなってからでいい。
0010デフォルトの名無しさん
垢版 |
2015/05/21(木) 20:29:21.14ID:taYfOZ7g
前スレの8bit単位の乗算とか、そういう頻繁にありそうなケースに対応した命令を用意してくれないと、
間口広がんないよ・・・。
0011デフォルトの名無しさん
垢版 |
2015/05/21(木) 20:45:29.77ID:2/488D5d
8/16bitぐらいのIndex範囲でテーブル引きしれくれる命令がほしいわ

8bit演算するにも無駄なシャッフルしなくても良い命令がそろったのがSSE4辺りで
さらにAMDが未対応みたいな期間長すぎたな
0012デフォルトの名無しさん
垢版 |
2015/05/22(金) 01:51:48.18ID:pqX01hMi
命令に対応してたってそれを実行するユニットがそれ相応に強化されてなければ大して効果ないよ
0013デフォルトの名無しさん
垢版 |
2015/05/23(土) 18:03:12.07ID:1SFlVJvM
並列計算が実装されてないか、使っても遅いとき、通常の演算で並列できないか?

(a0 + a1X + a2X^2 + a3X^3) ( s + tX) のXの1乗、3乗を取り出すことで、
0014デフォルトの名無しさん
垢版 |
2015/05/23(土) 18:08:24.46ID:1SFlVJvM
途中送信した。
上のXの項は、t a0 + s a1
上のX^3の項は、t a2 + s a3

Xをたとえば2^10や2^16と取り、下位からの桁上りがないとすると、ビット演算でデータ取り出せる。
0015デフォルトの名無しさん
垢版 |
2015/05/23(土) 19:52:22.42ID:1SFlVJvM
>>13>>14を実装して並列計算の叩き台を作った。微妙に速度アップした。結果が正しくないが計算量は正しいはず。

#include <iostream>
#include <time.h>
using namespace std;
#define N (1<<18)
void initdata(unsigned char *a, int range){ for(int n=0; n<2*range; n+=2) { a[n]=rand()%256; a[n+1]=rand()%256; }}

#define cal(x,y,s) {x=(x*s + y*(255-s))&255; y=(y*s + x*(255-s))&255;}
void test(unsigned char *a) {
for(int n=0; n<2*N; n+=2) {
unsigned char x=a[n], y=a[n+1];
for(int s=1; s<255; s++) cal(x,y,s); for(int s=1; s<255; s++) cal(x,y,s); for(int s=1; s<255; s++) cal(x,y,s); for(int s=1; s<255; s++) cal(x,y,s);
a[n]=x; a[n+1]=y; }}

// (a0 + a1X + a2X^2 + a3X^3) ( 255-s + sX) Xの項は、s*a0 + (255-s)*a1 X^3の項は、s*a2 + (255-s)*a3
#define dset(x,y) (x) + ((y)<<8) + ((y)<<16) + ((x)<<24);
#define cal2(x,s) { x *= ( s + ((255-s)<<8) ); unsigned char c=(x>>8)&255, d=(x>>24)&255; x = dset(c,d); }
void test2(unsigned char *a) {
for(int n=0; n<2*N; n+=2) {
unsigned int x = dset(a[n], a[n+1]);
for(int s=1; s<255; s++) cal2(x,s); for(int s=1; s<255; s++) cal2(x,s); for(int s=1; s<255; s++) cal2(x,s); for(int s=1; s<255; s++) cal2(x,s);
a[n]=(x>>8)&255; a[n+1]=(x>>24)&255; }}

int main() {
unsigned char *a = new unsigned char [2*N],*b = new unsigned char [2*N];
initdata(a, N); memcpy(b,a,2*N);
cout<<"memcmp(a,b):"<<(memcmp(a,b,2*N)?"false":"true")<<endl;
unsigned long t=clock(); test(a); t=clock()-t; cout<<t<<endl;
t=clock(); test2(b); t=clock()-t; cout<<t<<endl;
cout<<"memcmp(a,b):"<<(memcmp(a,b,2*N)?"false":"true")<<endl;
return 0; }
0016デフォルトの名無しさん
垢版 |
2015/05/27(水) 11:09:42.07ID:f/0uemgN
前スレ終わりごろのビットマップ合成の話だが、結果的にはスカラ版と比較して
5倍程度に収まっていたが、初期はスカラ版より遅い結果しか出せていなかった。
スカラ版と等速なら話はわかるが、
なぜ遅くなるのか?
俺も似たようなこと遭遇した記憶はあるが
詳細が思い出せない。
0017デフォルトの名無しさん
垢版 |
2015/05/27(水) 13:45:50.89ID:2yaRNWB+
SIMD関連はまず命令の実行に都合のいいようにデータを作成するのと
結果を取り出すのに時間がかかるからじゃね?
それとSSEレジスタは128bitなので1処理当たり32bit使うと4並列にしかならない
AVX/AVX2なら256bitなのでこちらの方が速度が上がると思う
0018デフォルトの名無しさん
垢版 |
2015/05/27(水) 15:22:12.59ID:TYkQbksz
>>16
構造体へのコピーをスカラで何倍もの時間かけてやってたから
本体処理が4秒が1秒に縮まったところでセットアップに5秒かかってたら意味がない

ボトルネックを解消するつもりでSIMDを使ったつもりが新たな別のボトルネックを作ってました
しかもなんで遅くなったのか使った本人が認識してないというの。
0019デフォルトの名無しさん
垢版 |
2015/05/27(水) 18:10:04.45ID:1+NR3ImF
つまりSIMDレジスタで計算する為に
スカラ以上に命令を使った為
遅くなったということか。
前スレの968では見直ししたが2倍ほど遅いと言っていた。
本来4倍になるはずが1/2倍、
8倍も遅くなるなんてありえるか?
根本的に何か問題があるとしか
思えん。
0020デフォルトの名無しさん
垢版 |
2015/05/27(水) 19:09:25.21ID:VZ6+fhUn
あんなのソースコード見ればボトルネックがどこにあるか一発でわかるだろ
見ただけでわからんやつは向いてないよ
0021デフォルトの名無しさん
垢版 |
2015/05/27(水) 19:11:41.34ID:VZ6+fhUn
「ハッカーのたのしみ」とかの良著をよく読むことをすすめるよ
並列化アルゴリズムに理解のないやつがいきなりSSEやAVX使っても不幸にしかならない
0022デフォルトの名無しさん
垢版 |
2015/05/27(水) 19:52:40.39ID:21LcoVTJ
然しものSIMDも、まったくオーバーヘッドがないわけじゃぁない。
SIMDに演算させるためのデータ構造整えなんかの命令分がオーバーヘッドになる。
これを最小に抑えつつ、SIMDの並列演算性能を活かすのが腕の見せ所よ。
0023デフォルトの名無しさん
垢版 |
2015/05/29(金) 18:33:22.93ID:5gPBcsmJ
メモリクソ余ってんだから最初からSIMD前提なデータ構造強制できりゃいいのになぁ
0024デフォルトの名無しさん
垢版 |
2015/06/08(月) 22:06:48.16ID:XUgdS8pG
すいません。以下のようなことがやりたいのですがどうするのが一番いいですか。

void up_index(short a[16],short b[16])
{
0025デフォルトの名無しさん
垢版 |
2015/06/08(月) 22:12:29.64ID:XUgdS8pG
すいません。途中で書き込みました。
avx2でお願いします。

void up_index(short a[16],short b[16])
{
for(int i=0;i<15;i++)
{
b[i]=a[i+1];
}
b[15]=0;
}

void down_index(short a[16],short b[16])
{
b[0]=0;
for(int i=1;i<16;i++)
{
b[i]=a[i-1];
}
}
0026,,・´∀`・,,)っ-○○○
垢版 |
2015/06/08(月) 22:54:29.21ID:GQ7FFrMa
void up_index(short a[16],short b[16])
{
__m256i mask = _mm256_setr_epi16(
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0x0000
);
__m256i x = _mm256_loadu_si256((__m256i*)a[1])
x = _mm256_and_si256(x, mask);
_mm256_storeu_si256((__m256i*)b, x);
}

あとわかるよな?
0028デフォルトの名無しさん
垢版 |
2015/06/08(月) 23:02:02.79ID:XUgdS8pG
>>__m256i x = _mm256_loadu_si256((__m256i*)a[1])
領域外(a[16])を参照してるような…
ゴミが入るだけだから気にしなくていいってことですか?
0029デフォルトの名無しさん
垢版 |
2015/06/08(月) 23:58:10.30ID:XUgdS8pG
うごいてるっぽいので気にしないことにします。
ありがとうございました。
003125
垢版 |
2015/06/09(火) 00:47:54.26ID:8QWNG3PG
>>ページ境界跨がなきゃ平気
跨ぐとどうなるんでしょうか。
突然プログラムがあぼーんすることも覚悟しなきゃいけないってことですか?
0033デフォルトの名無しさん
垢版 |
2015/06/09(火) 02:26:12.65ID:+xTmfGgc
https://software.intel.com/sites/products/documentation/doclib/iss/2013/compiler/cpp-lin/GUID-F4DA723A-DEB9-42D8-82FF-72553EB24273.htm

ここによるとアラインされてなくてもいけるcompiler intrinsicsだわな
アラインが必要なのは

https://software.intel.com/sites/products/documentation/doclib/iss/2013/compiler/cpp-lin/GUID-29CB35FA-F50D-4F6E-88B6-D3A1D83BE311.htm

こっちの方だ
_mm256_load_si256()

ただ当然境界がズレている所は2回ほど読むだろうから速度を気にするのなら
最初から_mm256_load_si256()を使ってデータの配置もアライメント通りにしとくのに限る

配列だと__attribute__((aligned(16)))を付けて置くといいわな
0035デフォルトの名無しさん
垢版 |
2015/06/09(火) 08:01:24.58ID:uvrBn2pL
別にアライメントの話じゃないし。
つうか領域外読み込んでも
落ちないからOKとか
それはないから
0036,,・´∀`・,,)っ-○○○
垢版 |
2015/06/09(火) 10:18:10.60ID:hpY+QnAE
上下128ビット跨いだシフトが簡単にできないから
ミスアラインロード使わないとめんどくさいんだよねー

void up_index(short a[16],short b[16])
{
  __m256i x = _mm256_load_si256((__m256i*)a);
  __m128i u = mm_mm256_extracti128_si256(x, 1);
  x = _mm256_alignr_epi8( x, _mm256_castsi128_si256(u), 14);
  _mm256_store_si256((__m256i*)b, x);
}
003825
垢版 |
2015/06/09(火) 21:40:12.66ID:8QWNG3PG
16 x 16 だと結構オーバヘッド覚悟しなきゃいけないみたいですね。
11 x 11 なら128ビットに納まるから上下左右1ビットシフト高速にできますかね?
0039,,・´∀`・,,)っ-○○○
垢版 |
2015/06/09(火) 21:47:54.51ID:X9YqiuVE
ビットボードでも作ってるの?

11ビットとかかえって扱いづらいからやめとき?pslldq/psrldqは8ビット単位だからいろいろ面倒だぞ
16x16でもvextractf128+vpalignrの2命令ですむんんだからそれが一番無難
2のべき乗のほうが扱いやすい
0041デフォルトの名無しさん
垢版 |
2015/06/09(火) 21:55:17.24ID:8QWNG3PG
>>39
はい、まさにビットボードです。
9 x 9 あれば囲碁9路盤が作れます。
やっぱ2のべき乗ですかね〜。
0042デフォルトの名無しさん
垢版 |
2015/06/09(火) 22:00:22.26ID:uvrBn2pL
SIMDとか並列プログラムは
各要素間の関連が薄けりゃ薄いほど良い
相関ゼロなら100%の性能が出せるが
逆なら劣化する。
要はお前のプランはSIMD向きじゃねえんだよ。
スカラで組めカス。
0044,,・´∀`・,,)っ-○○○
垢版 |
2015/06/09(火) 22:34:23.52ID:ftbXeVKR
上下128ビットの入れ替えが面倒なら、1レジスタで1ボードじゃなくて2レジスタで2ボードみたいな割り当てもアリかな
0046デフォルトの名無しさん
垢版 |
2015/06/11(木) 17:55:12.67ID:6lVnkCXZ
1レジスタに1ボードのらないで2レジスタに2ボードのる状況が想像できない。
0047,,・´∀`・,,)っ-○○○
垢版 |
2015/06/11(木) 21:11:39.78ID:ucI+50Qq
me too

碁盤の19x19なら1列32ビットに割り当てて128ビットの4x5レジスタじゃいかんのか?
256ビットなら3レジスタか。ちと苦しいな
0049デフォルトの名無しさん
垢版 |
2015/06/13(土) 04:02:16.52ID:0MXVYW8Q
さて、そろそろ団子が実験結果を公開してくれる頃だと思うんだが……
ソース書けた?
0051デフォルトの名無しさん
垢版 |
2015/06/22(月) 09:21:43.06ID:0p5/VSpX
結局SSEとかの機械語でやる以外にC++には高速化の手段がないの?(´・ω・`)
後、変なclassを使わないとか?(´・ω・`)
0052デフォルトの名無しさん
垢版 |
2015/06/22(月) 16:45:31.61ID:BEzC3Nfs
クラスで遅くなるとか迷信でしょ
0053デフォルトの名無しさん
垢版 |
2015/06/22(月) 16:51:45.79ID:cpn0Yuio
今はSIMDがあるから
かろうじてC++使ってるけど
他で行けるようになったら
捨てると思う
0054,,・´∀`・,,)っ-○○○
垢版 |
2015/06/22(月) 16:56:25.34ID:h2li5DGU
クラスを使うから遅くなるんじゃなくて、動的なポリモーフィズムを実現するための仮想関数テーブルや
あるいは過剰にコンストラクタ呼び出しで遅くなる。
0056デフォルトの名無しさん
垢版 |
2015/06/22(月) 19:59:05.05ID:cpn0Yuio
いやーそんなん無いけどさー
己が納得出来れば良い訳よ
vector4クラスとかあって
最適化コンパイルでSIMD使いますよ〜
で良い。所詮趣味だし俺はそれで乗り換え出来る。
今はfortranやC++以外にはそれすらも無いからな
0057,,・´∀`・,,)っ-○○○
垢版 |
2015/06/22(月) 20:04:38.95ID:L2Qxnu5O
過度なオブジェクト指向(笑)やめればC++でもアセンブラに迫る高効率のコード書けますよ
0058デフォルトの名無しさん
垢版 |
2015/06/22(月) 21:19:49.22ID:468RGWDu
最近はCとアセンブラを比較することも少なくなったろうな。
数学ライブラリなんかはまだアセンブラで書いてんのかねぇ。
0060,,・´∀`・,,)っ-○○○
垢版 |
2015/06/22(月) 23:15:07.42ID:OAaA5v1W
演算子オーバーロードやテンプレートがCにあるならそうだね
どの程度の抽象化までならオーバーヘッドが生じないかはdvec.hあたりのIntel謹製クラスライブラリ見ればわかるでしょ
0061マ○コデラックス
垢版 |
2015/06/23(火) 23:58:04.32ID:bwjeXC/X
スレ立てるまででもない質問じゃない質問ってどんなの?
0062デフォルトの名無しさん
垢版 |
2015/06/26(金) 04:43:42.68ID:1ST1aZRQ
え?そこらへん使ってもアセンブラに迫る高効率のコード吐き出してくれるの?
0064デフォルトの名無しさん
垢版 |
2015/06/26(金) 13:07:25.04ID:KiE+sAI+
>>62
C にはない C++ のオーバーヘッドは、例外と仮想関数呼び出しのための関数テーブルアクセスと dynamic_cast<>()。
それらを使わなければ、型チェックの厳しい C として使える。
演算子オーバーロードは変な名前の関数を呼び出してるだけ。
コンストラクタとか(非仮想)デストラクタは C で同じ作法で作ったのと一緒。

最適化で言うと、俺の環境だと this を restrict として扱わないので、
this->func() を func( this ) にするとか人力で最適化されやすくしないといけないことがある。
0066,,・´∀`・,,)っ-○○○
垢版 |
2015/06/26(金) 23:08:38.05ID:Tf/lkRBh
あとはMSVCだとthisポインタをECXで渡すけどSSE*ってECXを暗黙にdestinationとして扱う命令あるじゃん
0069デフォルトの名無しさん
垢版 |
2015/07/04(土) 20:23:55.16ID:g1Tiw5j6
githubってよく知らないんだよなぁ。
イケてるギークはつかってるらしいが。
これを機にやってみるか…
0070 ◆kXDiHQuNQ2
垢版 |
2015/07/04(土) 22:33:31.72ID:g1Tiw5j6
http://www.age2.tv/rd05/src/up9736.zip.html

githubはとりあえず置いといて、ソースうpします。
物は囲連星というゲームの9路盤のAIです。

makefileが入ってるのでbenchmark.exeをmakeしてみてください。
うちのPC(core i7 4790)で40秒くらいで終わるベンチマークができます。
ベンチの内容はAIが3手プレイします。

SSE2で最適化したいクラスはPointSetというクラスで、
128bitつかって 10 x 10 のビットボードを実装しています。

SSE2化してみましたが速くなりませんでした。

スレの皆さん最適化よろしくお願いします。
0071デフォルトの名無しさん
垢版 |
2015/07/04(土) 22:42:47.73ID:YeWNQkLW
SSEって最適化できてもせいぜい20%アップ程度の気がするな。
アルゴリズムの見直しとか、CPU演算以外とかはやりきってるか?
0072デフォルトの名無しさん
垢版 |
2015/07/04(土) 22:49:03.16ID:g1Tiw5j6
ちなみにmakefileは依存関係全然考慮してないので毎回クリーンしてくださいw
コンパイラは64bit MinGWです。
0073デフォルトの名無しさん
垢版 |
2015/07/04(土) 22:51:51.53ID:g1Tiw5j6
オッとリロードしてなかった。
>>71
アルゴリズム見直しで速くなるのが一番いいんですけどね〜
なかなかアイディアが湧かないのでとりあえず手っ取り早いSSEを試してみたいです。
0074デフォルトの名無しさん
垢版 |
2015/07/04(土) 23:13:48.96ID:+CPi2s1F
>>73
i7 4790ならAVX2やiGPGPUで速くしたほうがいいんじゃないのか?
データ並列に適していないのにSIMDにしてもたいして速くならないと思うけど
いまの適している?
0075デフォルトの名無しさん
垢版 |
2015/07/04(土) 23:23:18.20ID:g1Tiw5j6
128bitで一つのビットボードになっていてもろandとかorとかandnotとかさせるので
SSE2で速くなるかなと思ったんですが。
AVX2は256bitですよね?どうやって適応させるか難しいです。
iGPGPUは使い方しらないorz
0076デフォルトの名無しさん
垢版 |
2015/07/04(土) 23:28:34.72ID:Ika70OGI
iGPGPUとか全然ダメ。
並列処理向きな処理でも激遅。
最低でもメモリ空間共有がサポートされなきゃゴミ。
0077デフォルトの名無しさん
垢版 |
2015/07/05(日) 01:38:21.45ID:U8xf2vl9
>>70はピンポイントでSSE化したい所、出来そうな所だけピックアップしてくれよ。
これでは解析が手間。
0079 ◆kXDiHQuNQ2
垢版 |
2015/07/05(日) 08:14:07.41ID:rj88vDKP
>>77
SSE化できそうなところはPointSetというクラスですが、
じつはもうSSE化してます。
でも速くなんなかった。

なぜ速くならなかったか教えていただけると助かります。

>>78
PointSetボトルネックになってないんですかね。
結構使ってるはずなんですが。
0080,,・´∀`・,,)っ-○○○
垢版 |
2015/07/05(日) 08:44:17.99ID:5Fixj9dP
関数ごとのプロファイルとってみて総実行時間を見てみるといいよ
並列化できない(と思ってる)ところが最大のボトルネックになってるなら他をいじってもどうしようもない
0084デフォルトの名無しさん
垢版 |
2015/07/05(日) 10:50:19.25ID:rj88vDKP
ビットフィールドの立ってるビット数える関数をSSE4.2のpopcnt使ったらえらい速くなったんだが?
0087デフォルトの名無しさん
垢版 |
2015/07/05(日) 11:49:59.66ID:pEwkWnHA
ちょっと伺いたいんですがavxまでで8bit(1byte)の中で上半分、下半分を取り出すのはありますか?
avx2までいくとpextというmaskをとった部分のビットだけ抽出するのはあるようなんですが・・・
0088デフォルトの名無しさん
垢版 |
2015/07/05(日) 13:52:49.93ID:TGTnUn4r
pextというとBMI2かね
汎用レジスタでの話ならシフトとandじゃダメな理由があるのかね
連続したnビットを取り出したいだけならレイテンシの長い(3clk)pextを使う価値があまりない

mov eax, 0fh
mov edx, f0h
pext eax, esi, eax
pext edx, esi, edx
5クロック

mov eax, esi
mov edx, esi
shr edx, 4
and eax, 0fh
and edx, 0fh
3クロック、movが消えるなら2クロック
0091デフォルトの名無しさん
垢版 |
2015/07/05(日) 14:43:20.51ID:pEwkWnHA
>>90
ちょうどこんな感じです!
このソースみたいにlowerとupperを取り出して返す関数つくろうと思ってました

下4bitはそのまま0xfでmaskして、上4bitは4bitシフトしてからmaskなのでこのコードで行けそうです
ありがとうございます
0094デフォルトの名無しさん
垢版 |
2015/07/05(日) 16:55:23.92ID:pEwkWnHA
いえアセンブリがわからないだけです!
>>92でいけるのならやってみます!ありがとうございます!
0095デフォルトの名無しさん
垢版 |
2015/07/05(日) 17:09:15.78ID:rj88vDKP
gprofの結果ビットボードを座標のベクタに変換する関数PointSet::toVector()が時間かかってることが分かった。
すまん、ちょっと飯食ってくる。
0096デフォルトの名無しさん
垢版 |
2015/07/05(日) 17:14:58.64ID:7niimHYF
大概は思わぬところでサイクルを食ってるもんだ。
食うのは飯だけにしたいものだな。
0097デフォルトの名無しさん
垢版 |
2015/07/05(日) 19:12:24.15ID:rj88vDKP
PointSet::toVector()は一回最適化試みた箇所なんだよなぁ
正直これ以上アイディアうかばん。
0098デフォルトの名無しさん
垢版 |
2015/07/05(日) 19:48:59.00ID:U8xf2vl9
なにをしてるか知らないがここが時間食ってる。
8ビットや16ビットで区切って計算結果を配列に入れといて利用するとかできないか?


int size()const
{
int res=0;
unsigned long long i;
i = u.table[0];
while (i)
{
++res;
i = (i - 1)&i;
}
i = u.table[1];
while (i)
{
++res;
i = (i - 1)&i;
}
return res;
}
0099デフォルトの名無しさん
垢版 |
2015/07/05(日) 19:54:28.58ID:U8xf2vl9
あとここも。
32bitでの実行だが。


int get(Point p)const
{
// return !((*this) & x_line[p.x()] & y_line[p.y()]).empty();
return (table[p.y() & 1] >> (p.x() + (p.y() >> 1) * 10)) & 1;
}
0101デフォルトの名無しさん
垢版 |
2015/07/05(日) 20:02:29.73ID:rj88vDKP
>>98
レスありがとうございます。
そこはビットボードのビットが立ってる数を数えています。
SSE4.2のpopcntに置き換えたら大分速くなりました。

>>99
そこはビットボードの座標pのビットが立ってるかどうか返す関数ですね。
正直そこはそれ以上最適化できないと思ってますが、うまい手ありますかね。
0103デフォルトの名無しさん
垢版 |
2015/07/05(日) 23:55:30.55ID:pEwkWnHA
>>102
なるほど!
ちなみにシフト操作て5bitシフトならCPUのサイクル数5倍になるとかあるんですか?
0107デフォルトの名無しさん
垢版 |
2015/07/06(月) 09:26:17.06ID:9h3CM3fP
386からは一発だな
その代わりマスクがかかる

286ま命令はあったがマイクロコード
8086はCLで回数指定以外、多ビットシフト命令が無かった

はず
0108デフォルトの名無しさん
垢版 |
2015/07/06(月) 17:03:51.46ID:obJwiAn/
cpuの命令セットて全部アセンブラに還元されるんですか?
もしそうなら命令セットてアセンブラで作ったライブラリみたいなものですよね?
0109デフォルトの名無しさん
垢版 |
2015/07/06(月) 17:18:20.33ID:hLGIY9Ls
アセンブラとCPU命令と機械語は一対一対応で見かけだけの違いだろ。
より人間よりの記法がアセンブラ。
0110デフォルトの名無しさん
垢版 |
2015/07/06(月) 17:19:36.84ID:g1ABbiM2
ライブラリ?
0111デフォルトの名無しさん
垢版 |
2015/07/06(月) 18:59:39.73ID:K/ajJWQg
アセンブラに、1語で複数インストラクションに対応する組み込み済みマクロはよくあるね。
ユーザーにとっては見かけ上機械語のニモニックと変わらん
0113デフォルトの名無しさん
垢版 |
2015/07/16(木) 18:53:32.86ID:l6l+0TT5
シフト命令がサイクル数変わらずって事は
もしや乗算命令も……?
0117デフォルトの名無しさん
垢版 |
2015/07/21(火) 08:40:49.05ID:JVfLP5Iv
効率て何?
回路規模?
速度とアルゴリズムのシンプルさなら表引きだけどな。
0118デフォルトの名無しさん
垢版 |
2015/07/21(火) 12:54:25.50ID:KUd+SBCt
表引きて何バイトの表用意するつもり?
0119デフォルトの名無しさん
垢版 |
2015/07/21(火) 13:57:35.38ID:tQ/auOKg
>>109
ニーモニックとオペコードは一対一とは限らないよ。
0121デフォルトの名無しさん
垢版 |
2015/07/22(水) 01:54:32.08ID:Vve5AGCV
>>116
まあ筆算は筆算だけどね、boothのアルゴリズムとかwallace treeとか調べてみるといいと思うよ
0122デフォルトの名無しさん
垢版 |
2015/07/29(水) 01:28:21.81ID:OiAbEds4
>>76は今の時点だとあたってるように思えるなあ
CPUと頻繁にデータやり取りしたり、十分長い時間計算させるのでなければオーバーヘッド大きすぎるし
0123デフォルトの名無しさん
垢版 |
2015/10/01(木) 15:36:21.06ID:X8BXmh6N
pcooがいいかboostがいいかって話もここでいいの?
0127デフォルトの名無しさん
垢版 |
2015/10/23(金) 09:29:13.47ID:I0uni5nx
☆ 日本の核武装は早急に必須ですわ。☆
総務省の『憲法改正国民投票法』、でググってみてください。
日本国民の皆様方、2016年7月の『第24回 参議院選挙』で、日本人の悲願である
改憲の成就が決まります。皆様方、必ず投票に自ら足を運んでください。お願い致します。
0128デフォルトの名無しさん
垢版 |
2015/11/18(水) 22:46:47.01ID:LC5LQUuD
>>116
いろいろとある
筆算方式だと桁数が倍になれば計算時間や回路規模が4倍になるけど、
3倍で済む方法もあるし、
2倍ちょっとで済む方法もある。
0129デフォルトの名無しさん
垢版 |
2015/11/23(月) 15:07:59.69ID:ZNmYnLez
>>127
「米国におしつけられた憲法」「日本人悲願の」といいつつ
米の意向による改憲だけどな
さすが米国の金で設立された米の利益代表団体自民党、国民を騙すのに躊躇ないぜ
0130デフォルトの名無しさん
垢版 |
2015/11/23(月) 17:35:17.53ID:OK+rBFmG
intelの乗算がスループットが1clock、レイテンシが3clock。
どうやったら3clockで計算が終わるん?
0134デフォルトの名無しさん
垢版 |
2015/11/24(火) 19:32:05.64ID:4kZfiltG
テーブル参照で済ませてんのかな?
教えて、だんごの人!
0135デフォルトの名無しさん
垢版 |
2015/11/24(火) 21:52:15.52ID:VivS0v9A
Load, Storeは別でしょ
乗算は
53bit x 53bit の整数乗算
106bitから53bitへの丸め
指数部分の計算
などが必要
この中で53bit x 53bitが一番時間がかかる

3つに分けるとしたらたとえば
1. 53bit x 20bit
2. 前の結果 + 53bit x 20bit
3. 前の結果 + 53bit x 13bit, 丸め, 指数計算
とか
0136デフォルトの名無しさん
垢版 |
2015/11/24(火) 21:53:14.32ID:VivS0v9A
テーブルは割り算では使うけど、掛け算は使わないと思う
0137,,・´∀`・,,)っ-○○○
垢版 |
2015/11/25(水) 02:03:47.62ID:45GjjvYt
運転手が自動車のエンジンの内部構造を知る必要はない
車を動かすだけの最低限の知識さえあればいい
0138デフォルトの名無しさん
垢版 |
2015/11/25(水) 04:32:17.38ID:eJijZLoL
内部構造を知る事による運転技術の向上の可能性を否定出来ない。 (英訳せよ
0139デフォルトの名無しさん
垢版 |
2015/11/25(水) 08:50:00.26ID:s9hTLLjK
速いレーシングドライバーやライダーというものは、エンジンの内部構造だけではなく、
フレームの特性から、タイヤマネージメント、そしてメンタルをコントロールするための心理学まで詳しい。
0141デフォルトの名無しさん
垢版 |
2015/11/25(水) 16:07:40.71ID:9VrR2D9e
>>139
ペーパーテストでリアウイングを立てる効果を問われて
スポンサーロゴがよく見えるって答えたF1ドライバーが
ワールドチャンピオンになったぞ。
0142デフォルトの名無しさん
垢版 |
2015/11/25(水) 16:08:46.62ID:rHMnfdo0
これマジ?

65 名前:Socket774[sage] 投稿日:2015/11/22(日) 00:16:33.62 ID:0X8V8J8N [1/2]
>>16 の続き

調べたらいろいろとわかってきました。
非常に長い間(2ms程度でばらつきあり)書き換えていないレジスタを使用すると
レイテンシが1増加するようです

以下は私の予想
2msといえばWindowsのスレッドのタイムスライス値のオーダーなので、
XSAVE/XRSTORあたりにエラッタがあると予想
XRSTOR以降値を更新してないレジスタを使用するとレイテンシが1増えてしまう
通常2msも同じ値を保持することはマレなので特に大きな問題とはとらえられていない
が、Broadwellで直っているのでintelはこの問題を認識はしているのでしょう

----
発生することを確認した命令
vaddpd, vsubpd, vaddsubpd, vmulpd, fma***pd
vaddps, vsubps, vaddsubps, vmulps, fma***ps
(128bitでも256bitでも)

発生しないことを確認した命令 :
addpd, subpd, addsubpd, mulpd
addps, subps, addsubps, mulps
vandpd, vorpd, vpand, vpor

発生することを確認したプロセッサ : Haswell
発生しないことを確認したプロセッサ : SandyBridge, IvyBridge, Broadwell
0149デフォルトの名無しさん
垢版 |
2015/11/27(金) 00:58:51.08ID:B/NYVAdM
電源回路の一部をCPUに乗っけてノイズ乗りまくり不安定になった馬鹿設計のCPU。
0151デフォルトの名無しさん
垢版 |
2015/11/29(日) 17:12:51.03ID:U49gaUJj
intel の主力 CPU製品の世代・バージョンを表すコード名だよ
セレロンとか Core7 とか商品名に隠れて見えにくくされてる
ちなみに現行最新は broadwell に替わってるらしい
0156デフォルトの名無しさん
垢版 |
2015/12/01(火) 09:29:42.23ID:euK/mxZa
素晴らしいかどうかは兎も角、最適化の必要がないのは同意。
だってみかけねぇもんw
0157デフォルトの名無しさん
垢版 |
2015/12/01(火) 09:39:53.24ID:WgVnPdZx
haswell、amd64知らないっておまえらゆとりすぎだろ、おい。
and64っていわゆるx64命令セットのことだ。AMDのCPUのことじゃない。
0160デフォルトの名無しさん
垢版 |
2015/12/01(火) 13:22:36.19ID:BYRY3bxz
AMDはx86互換の64bitCPUを早い段階で提唱したのが最大の功績
MSもそれに乗っかった
Intelまかせだったら64bit環境のコンシューマへの普及が遅れていたか
満足なものにならなかった可能性がある
IntelはItaniumとかいう普通の人からしたらゴミな物を売りたかっただろうし
将来的にはIA-64に置き換えるつもりだったらしいが
未だに32bitアプリが溢れていることを考えると互換を切るのは良くなかった
一応激遅のx86エミュレーションは付いていたが
互換で食っていた会社の癖に互換を切り捨てるとは何事ぞ
0161デフォルトの名無しさん
垢版 |
2015/12/01(火) 16:31:29.60ID:xuYieJrT
互換切っちゃいけねえのは当然かもしんないけど
未だに4bitだか8bitのCPUに由来する制限や設計の歪みを引き継ぎ続けるのもなぁ……
カウンタレジスタとしてはRCXしか使えませんとかあまりにもウンコすぎる
0162デフォルトの名無しさん
垢版 |
2015/12/01(火) 17:19:11.09ID:yW8K+bhB
そんなん先読みやら最適化の都合じゃないの?

それに互換ぶっ壊していいのなら ARM にしちゃいなよ
0163デフォルトの名無しさん
垢版 |
2015/12/01(火) 20:49:07.03ID:DqfiEd0O
64bit化の時が、唯一のx86系命令のエンコードを変えるチャンスだった
汎用レジスタは16個に増えたけど、それ以外はしょぼいまま継ぎ足し継ぎ足しのエンコード
命令が複雑すぎるし効率的じゃないし汎用整数命令が2オペランドのままだし

汎用レジスタ数増大
2SRC, 1DEST の非破壊演算
3オペランドの自由論理演算
アドレス計算用の簡易で高速な積和命令追加 (いまだLEAが重要命令って異常だろ)
乗算除算命令のレジスタ縛り削除
フラグ未使用の演算増加 or フラグの多重化

一応ちまちまは増えてるけどそんなんじゃダメ
一気に増やさないと使われないから意味がない
0164デフォルトの名無しさん
垢版 |
2015/12/01(火) 21:11:09.22ID:lfUAYGEe
一切のしがらみを解き放って、ゼロベースで命令セットを設計したら、
どれくらいの性能を叩きだせるんだろうか?
0166デフォルトの名無しさん
垢版 |
2015/12/01(火) 21:23:08.46ID:DqfiEd0O
メニーコア系だな
GPUとCPUとDSPの良いところ取り
GPUとCPUは区別がなくなる
デコーダーやスケジューラーは極力小さく、
演算器と入出力に大きく回路を割く
0167デフォルトの名無しさん
垢版 |
2015/12/01(火) 21:26:16.98ID:DqfiEd0O
Itaniumの失敗は、
x86を軽視した
コンパイル時最適化がCPUの進化に合わなかった
こんな感じか?
0169,,・´∀`・,,)っ-○○○
垢版 |
2015/12/01(火) 21:28:26.40ID:woh9g3Fk
並列化は並列化できないクリティカルパスで行き詰る
パンの製造ラインをいくら増やそうが1つのパンの一次発酵と二次発酵を同時にできないのと同じ。
0170デフォルトの名無しさん
垢版 |
2015/12/01(火) 21:39:52.86ID:DqfiEd0O
その為に非対称メニーコアとかいう考えもあるけど...
今ある重い処理の多くは並列化可能でしょ
0174デフォルトの名無しさん
垢版 |
2015/12/01(火) 21:48:08.42ID:lfUAYGEe
>>166
Cellやララビの方向性かな?
いずれにせよ、プログラマがどこまでしんどい重いするかも重要やね。
0175デフォルトの名無しさん
垢版 |
2015/12/01(火) 21:49:36.60ID:WgVnPdZx
条件分岐あるからクリティカルパスも変動するから、消費電力を対価に投棄実行できなくもないよ。
0178,,・´∀`・,,)っ-○○○
垢版 |
2015/12/01(火) 22:21:53.65ID:woh9g3Fk
ハードの設計の努力を知らない下衆が偉そうに語ることは何一つないのよ
与えられたものをうまく使う方法だけ考えればいい
0179デフォルトの名無しさん
垢版 |
2015/12/01(火) 22:22:38.64ID:M545w8lo
クリティカルパスってそんな問題になるかなぁ。
コア数が1万とかになったら大問題かもしれんが、
コア数4とかじゃあんまり問題に成らなくね。
0180デフォルトの名無しさん
垢版 |
2015/12/01(火) 22:27:59.76ID:BYRY3bxz
最近の事情は良く知らないんだけど
IntelのCPUでGPU内臓じゃないのってあるの?
サーバー用じゃなく
0182デフォルトの名無しさん
垢版 |
2015/12/01(火) 22:57:39.27ID:BYRY3bxz
ちょっと一般向けとは言いがたいね
しかもHaswellだし
個人的にGPUはグラボ刺すからCPUに内蔵してほしくないんだよなぁ
GPU無しで、その分値段を落としたモデルがほしい
0185デフォルトの名無しさん
垢版 |
2015/12/02(水) 00:34:39.84ID:0XpBrEKR
GPUユニットは並列演算に利用できるのにそれが必要ない用途ねぇ。
Xeonでいいはずなのにキャッシュもメモリ帯域もコア数も必要ないってことですよねぇ。
結局、内臓GPU必要ないってことはゲーム用途でしょうねぇ。
0186デフォルトの名無しさん
垢版 |
2015/12/02(水) 04:57:08.43ID:rypJABRF
>>179
クリティカルパスってコア数が少ない方がループ回数が増えるから影響が大きくなると思うけどな
クリティカルセクションと勘違いしてない?

この話の流れでクリティカルパスがでてくるのがおかしいんだよ
アウトオブオーダにしろ、VLIWやメイニーコアにしろ、クリティカルパスの問題は一緒
違いがあるのは並列化の粒度でしょ
小さい粒度のはOoO、大きなのはメイニーコアが適していて、静的な並列化は中途半端だったということ
0188,,・´∀`・,,)っ-○○○
垢版 |
2015/12/02(水) 06:21:53.98ID:LTVoUgjb
同じコア性能なら多いほうが多い、それは当たり前だ
しかし低性能なコアを複数並べれば高機能なコアより常に速いというのは幻想

KNCのボトルネックがまさにイニシャル処理で、KNC側でやると遅いから大体ホスト側にやらせることになる
0189デフォルトの名無しさん
垢版 |
2015/12/02(水) 12:21:50.26ID:rypJABRF
また的外れなこと言ってる
団子って周りから人の話聞いてないって言われないか?

OoOはCPU内でディスパッチやリダクションしてる為に熱的に限界を迎えて
性能があげられなくなったからメイニーコアやGPUの方向性が出てきたんでしょ
用途によって向き不向きがあるから棲み分けするようになって、今はその匙加減を
調整してる状況なんだろうな
CELLみたいにバランスの悪いのは結局は残れないってことなんだろうね
0191デフォルトの名無しさん
垢版 |
2015/12/02(水) 14:17:02.16ID:aHX8DqFu
GPUユニットより柔軟性の高いSIMD演算器を高速なローカルストレージと一緒にCPUに内蔵させたい
GPGPU無駄多すぎ
0192デフォルトの名無しさん
垢版 |
2015/12/02(水) 15:49:04.71ID:tY3PsYOb
個人的にはSIMDが1024-wayとかになったら面白いんだが
サーバー用としてはメニーコアの方が相性が良いので
そういう流れにはならないだろうが
0193デフォルトの名無しさん
垢版 |
2015/12/02(水) 19:05:39.75ID:lLZXeX9n
ベクトルコンピューターがそんな感じだった
ベクトル化出来ない処理は急激に遅くなるから、
今はコア数とバランス良くって方向になってる

AVXが8way
AVX512が16way
Geforceが32way
Radeonが64way
最高でも64wayあたりに落ち着くのでは?
0194デフォルトの名無しさん
垢版 |
2015/12/02(水) 19:13:57.66ID:lSgAR6hy
>>191
SIMD、柔軟性高いかなぁ?
データの並びとか気を付けないといけないし、プレディケーションもプログラマが書かないとできない。
非アライメントのペナルティが軽減されたのは有難いけど、
せめてプレディケーションくらいはGPUのようにHWでサポートしてほしいなぁ。
0195デフォルトの名無しさん
垢版 |
2015/12/02(水) 20:17:39.20ID:rypJABRF
コストの掛かるOoOでもSIMDにすれば相対的にコストが下がるというのもあるし
マスク演算ができるようになればプリディケードとブランチをプログラマが選べるようになる
インテルが目指してる方向は手堅いものだと思うな
0196デフォルトの名無しさん
垢版 |
2015/12/02(水) 20:53:25.97ID:73uUfhWJ
早く1024bit SIMD実装してほしいぜ。
囲碁の処理が速くなりそう。
碁盤は19 x 19だから512bitだと微妙なんだよな。
0197デフォルトの名無しさん
垢版 |
2015/12/02(水) 21:01:41.94ID:OrMGyZIC
ハードウェアベクタをあまり長くしても大半のアプリケーションで無駄が出るだけだろ。
GPUのやりかたが落としどころとしてベストだと思うがな。
0199デフォルトの名無しさん
垢版 |
2015/12/02(水) 21:29:46.57ID:lSgAR6hy
いや、C++に限らないんじゃない?
スレタイの【C++】や【SSE】ってのは主な手段であって、
GPUやFPGAだって立派な高速化手段だ。
0200デフォルトの名無しさん
垢版 |
2015/12/02(水) 21:52:10.30ID:lLZXeX9n
>>197
GPUで速くなる処理はベクタ長アップでも確実に速くなるよ
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使わずに最適化なんぞ出来る訳が無い
■ このスレッドは過去ログ倉庫に格納されています

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