掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
Delphiで人工ニューラルネットワーク(Artificial Neural Network)のクラスを作りましたが遅いです (ID:150825)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
なるほど。それは面倒ですね。 なら、とりあえずAVX命令は諦めてSSE命令で並列化してみては? こんな感じです。 2つのアセンブラ関数は関数内関数にするとレジスタの先頭に隠れたポインタが渡されるので関数の外にある必要があります。 これで高速化するなら AVXでさらに高速化出来るぞと. 2つにしたのは callのオーバーヘッドが大きいので4並列を3つ関数内で書いて12回分としてcall回数を減らそうという事です。 さらに長く続けても速くなるなら問題ないですよ。 procedure coffSum4(var pD, pS, coff4: single); asm // RCX RDX MOV RAX,coff4 MOVUPS XMM0, [RAX] // coffは MOVUPS XMM1, [RDX] //4word一度に処理する MOVUPS XMM2, [RCX] //4word一度に処理する MULPS XMM1, XMM0 //coff*pS^ ADDPS XMM2, XMM1 MOVUPS [RCX],XMM2 end; procedure coffSum12(var pD, pS, coff4: single); asm // RCX RDX R8 MOV RAX,coff4 MOVUPS XMM0, [RAX] // coffは MOVUPS XMM1, [RDX] //4word一度に処理する MOVUPS XMM2, [RCX] //4word一度に処理する MULPS XMM1, XMM0 //coff*pS^ ADDPS XMM2, XMM1 MOVUPS [RCX],XMM2 MOVUPS XMM1, [RDX+16] //4word一度に処理する MOVUPS XMM2, [RCX+16] //4word一度に処理する MULPS XMM1, XMM0 //coff*pS^ ADDPS XMM2, XMM1 MOVUPS [RCX+16],XMM2 MOVUPS XMM1, [RDX+32] //4word一度に処理する MOVUPS XMM2, [RCX+32] //4word一度に処理する MULPS XMM1, XMM0 //coff*pS^ ADDPS XMM2, XMM1 MOVUPS [RCX+32],XMM2 end; // RCX RDX xmm2 R9 procedure AVXcoffSum(var arD, arS: single; const coff: single; Count: integer); var Coff4: array[0..3] of single; //SSE命令の為の4word(16byte)の入れ物 pD, pS: ^single; i: integer; begin pD := @arD;//レジスタで pS := @arS; for i := 0 to High(Coff4) do coff4[i] := coff; // shufps にしてくれるかな while Count >= 12 do //SSE命令はWin64なら必須だから4個一度に計算可能 begin coffSum12(pD^, pS^,coff4[0]); Inc(pD, 12); Inc(pS, 12); Dec(Count, 12); end; while Count >= 4 do //SSE命令はWin64なら必須だから4個一度に計算可能 begin coffSum4(pD^, pS^,coff4[0]); Inc(pD, 4); Inc(pS, 4); Dec(Count, 4); end; while Count > 0 do //残りは最大3個だから begin pD^ := pD^ + coff * pS^; Inc(pD); Inc(pS); Dec(Count, 1); end; end;
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.