掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
Delphiで人工ニューラルネットワーク(Artificial Neural Network)のクラスを作りましたが遅いです (ID:150821)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
asmをいちなり書くと、アセンブラ関数になります。 その場合、ローカル変数が定義出来ないのでbeginの後にasmを書くインラインアセンブラにした方が良いでしょう。 もう一つの注意は壊してはいけないレジスタは保存しなければいけない事です。 Lazarusの場合は asm end 時にasm内で使用したレジスタを報告するので勝手にやってくれますが、Delphiはそうではなかったように記憶しています。 https://docwiki.embarcadero.com/RADStudio/Alexandria/ja/%E3%82%A4%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3_%E3%82%A2%E3%82%BB%E3%83%B3%E3%83%96%E3%83%AA_%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E4%BD%BF%E7%94%A8 壊してはいけないレジスタに XMM5 があるので ymm5を使っているので XMM5を保存しなければいけません。 https://docwiki.embarcadero.com/RADStudio/Alexandria/ja/%E3%82%A2%E3%82%BB%E3%83%B3%E3%83%96%E3%83%AA%E3%81%AE%E6%89%8B%E7%B6%9A%E3%81%8D%E3%81%A8%E9%96%A2%E6%95%B0 .SAVENV XMM5 が先頭に必要になるのでしょう 一度 ブレークポイントで止めて CPU迄で配置されたアセンブラコードを見るべきです。 例外で止まってしまう原因ですが、アセンブラ関数としていきなり引数を渡している点になると思われます。 上のリンク先にもありますが 64bitの引数は RCX、RDX、R8、 R9 という並びになります。 https://learn.microsoft.com/ja-jp/cpp/build/x64-calling-convention よって procedure CoffSum(pD,pS:PSingle;MulData:TMulSingle); RCX pD, RDX pS R8 MulData となっているはずです。 TMulSingleが配列なら MulDataは配列へのポインタです よって 最初のアセンブラ行 LEA RCX, MulData[0] により pDの値が上書きされていると思われます。 ブレークポイントで止めてCPU窓でかくにんしてください MOV RDX, pD //加算してゆく先 が MOV RDX, RCX となっていませんか? その場合、 RDXは RCXつまりMulDataに化けていて MulDataはポインタなので呼び出し元のMulData配列に書き込んでいるのしょう。MulDataが arra[0..31] of doubleでないなら、エラーになると思います。 対策は、私のコードのように、いちどローカル変数を定義して、そこに引数をcopyしてやるかprocedure の引数の順番を変えてやる事です。 元のようにループ内をインラインアセンブラにした方が良さそうに思えます。 その場合はxmm5が保存されているかCPU窓で確認してください。 保存されていないならarray [0..3]of singleの領域に xmm5を保存し復元して下さい VMOVUPS は無くても MOVUPSは使える筈(64bitなら) なお、 MulData: array [0..7] of single; としたのは VMOVUPS でcoffを渡すために 8個同じ値を入れようと思ったからで VBROADCASTSS という便利命令を使ったので 配列にする必要は後から考えると無かったのです。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.