掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
Delphiで人工ニューラルネットワーク(Artificial Neural Network)のクラスを作りましたが遅いです (ID:150809)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
リンク先はSIMD命令の例です Lazarusで試しているのでasmの書き方はDelphi用に直す必要があるかもしれません。一応アセンブラの文法は{$ASMMODE intel} にしてDelphiに寄せてはいるのですが(win64環境を想定しています) // for i:=0 to Count-1 do arD[i]:=arD[i] + coff*arS[i]; procedure AVXcoffSum(var arD, arS: single; coff: single; Count: integer); var //single32bitを 1ループで32個処理する MulData: array [0..7] of single; pD, pS: ^single; begin pD := @arD; pS := @arS; MulData[0] := coff;//値渡しなのでローカル変数にcopy while Count >= 32 do begin asm //以下は FMA+AVX 命令が使えればOK LEA RCX, MulData[0]; VBROADCASTSS ymm5, [RCX] //AVX 256bitレジスタに32bit値を埋める MOV RAX, pS // ソースアドレスをRAXに MOV RDX, pD //加算してゆく先 VMOVUPS YMM0, [RDX] //AVX VMOVUPS YMM1, [RDX+32] VMOVUPS YMM2, [RDX+64] VMOVUPS YMM3, [RDX+96] VFMADD231PS YMM0, YMM5, [RAX] //FMA YMM0+=YMM5*[RAX] VFMADD231PS YMM1, YMM5, [RAX+32] VFMADD231PS YMM2, YMM5, [RAX+64] VFMADD231PS YMM3, YMM5, [RAX+96] VMOVUPS [RDX], ymm0 VMOVUPS [RDX+32], ymm1 VMOVUPS [RDX+64], ymm2 VMOVUPS [RDX+96], ymm3 end ['RAX', 'RDX', 'ymm0', 'ymm1', 'ymm2', 'ymm3', 'ymm5']; Inc(pD, 32); Inc(pS, 32); Dec(Count, 32); end; while Count > 0 do begin pD^ := pD^ + MulData[0] * pS^; Inc(pD); Inc(pS); Dec(Count, 32); end; end;
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.