この広告は30日以上更新がないブログに表示されております。
新規記事の投稿を行うことで、非表示にすることが可能です。
広告
posted by fanblog
2023年02月27日
LazarusでRDTSCで処理時間を見てみた
SIMD命令で並列化コードを少し書いてみたが、実際にどれくらい速度が出るのか見てみたい。
そこで RDTSC命令を使ったライブラリを書いてみた 。
単精度のFOR文でAVXの8並列とSSEの4並列を比較してみたが、AVXの方がSSEより遅い結果が出てしまった。
そこで計算する順番を入れ替えると倍以上も速度がAVXが早いという当然の結果が出た。
どうやら 256個のデータで比較したせいか 命令キャッシュに2回目の呼び出しが収まるせいで2回目の処理時間が短くなるようだ
そこで RDTSC命令を使ったライブラリを書いてみた 。
単精度のFOR文でAVXの8並列とSSEの4並列を比較してみたが、AVXの方がSSEより遅い結果が出てしまった。
そこで計算する順番を入れ替えると倍以上も速度がAVXが早いという当然の結果が出た。
どうやら 256個のデータで比較したせいか 命令キャッシュに2回目の呼び出しが収まるせいで2回目の処理時間が短くなるようだ
2023年02月26日
win64のアライン16BYTE規制で思う事
64bitOSだから8byteアラインを強制されるなら仕方ないと思う
でも16byteアラインはどうなんだろう?
「SSEで128bit を高速に処理するには16byteアラインが必要」という主張は判るが
AVXで256bit AVX512で512bitだからそれらも処理するのだろうか?
画像処理とか専用のアプリ内だけで社内ルールでやればよい事のように思う。
そもそも現行のPCのRAMなどのバスは64bitだ。128bitアラインにして高速化するのはCPUのキャッシュ内にデータがある間だけ。キャッシュを超えるデーターを扱うとなれば、SSE命令使おうが無駄な話になる。
メモリを無駄に使えば、それだけキャッシュから外れるまでの余裕が短くなるだけではないか?
さらに内臓メモリの限界もある。それを超えれば仮想記憶でHDD/SSDとスワップするわけで、それが速度を決めてしまう。 だから速度を考えるのならメモリは少しでも節約すべきだろう。
昔 音声認識をするのに8bitの符号で対数的な重みを付け 加算や掛算をテーブル引きで行った事がある。
それでもそこそこの結果が得られた。 当時は掛け算さえ遅かった時代なので速度目的だった。
今ではむしろ遅くなる。
しかし今の人工知能のメモリ消費を考えると 案外8bitの対数的符号は速度面でも有利化もしれない。
メモリ消費が少なければそれだけキャッシュから外れる可能性も、そしてPCのメモリスワップが起きる可能性も小さく出来るのだから。
でも16byteアラインはどうなんだろう?
「SSEで128bit を高速に処理するには16byteアラインが必要」という主張は判るが
AVXで256bit AVX512で512bitだからそれらも処理するのだろうか?
画像処理とか専用のアプリ内だけで社内ルールでやればよい事のように思う。
そもそも現行のPCのRAMなどのバスは64bitだ。128bitアラインにして高速化するのはCPUのキャッシュ内にデータがある間だけ。キャッシュを超えるデーターを扱うとなれば、SSE命令使おうが無駄な話になる。
メモリを無駄に使えば、それだけキャッシュから外れるまでの余裕が短くなるだけではないか?
さらに内臓メモリの限界もある。それを超えれば仮想記憶でHDD/SSDとスワップするわけで、それが速度を決めてしまう。 だから速度を考えるのならメモリは少しでも節約すべきだろう。
昔 音声認識をするのに8bitの符号で対数的な重みを付け 加算や掛算をテーブル引きで行った事がある。
それでもそこそこの結果が得られた。 当時は掛け算さえ遅かった時代なので速度目的だった。
今ではむしろ遅くなる。
しかし今の人工知能のメモリ消費を考えると 案外8bitの対数的符号は速度面でも有利化もしれない。
メモリ消費が少なければそれだけキャッシュから外れる可能性も、そしてPCのメモリスワップが起きる可能性も小さく出来るのだから。
アセンブラを学ぶならLazarusが便利
ネイティブコンパイラで プログラムのデバッグをするとき、アセンブラが読めると便利です。
それが出来ないと、いわゆるPrintfデバッグ(Pascalだとwriteとか formatしてメモ帳に出力するとか)となります
アセンブラが読めるならブレークポイントを仕掛けてコンパイルがどうされたか見たり、レジスタの値を見たりと情報の幅が広がります。
アセンブラを学ぶのならLazarusは良い環境です。
asm文でアセンブラを埋め込め、そのアセンブラ文法もLinuxスタイルですが
Intelスタイルも{$ASMMODE intel} をasmの前に入れるだけで書けます。
アセンブラの文法は殆ど同じになりますが、コメントはPascal式 //より右か {この範囲} か (* この範囲 *)
アセンブラだけで何かプログラムするとなればPICとか1チップマイコンくらいになりますから、高級言語の中に埋め込むという方式で入るのがお勧めの理由です。
私もLazarusでWin64環境を始めたので四苦八苦です=> Lazarusでアセンブラを使う時の注意点
asm文を使わなければ出来ない事は色々あります。
・前回のようにCPUIDを読んで自分のPCのCPUの種類や機能を調べる
・パスカル言語にSAR 演算子が無い事の対策
・64bit以上の多倍長演算(アセンブラならフラグを使えるので)
・X*Y/X のように途中で桁溢れする計算の計算可能範囲を広げる
・コンパイラが使ってくれないSIMD命令の利用
もっとも、最近はスクリプト言語が隆盛なので意味がないのかもしれませんけどね。
それが出来ないと、いわゆるPrintfデバッグ(Pascalだとwriteとか formatしてメモ帳に出力するとか)となります
アセンブラが読めるならブレークポイントを仕掛けてコンパイルがどうされたか見たり、レジスタの値を見たりと情報の幅が広がります。
アセンブラを学ぶのならLazarusは良い環境です。
asm文でアセンブラを埋め込め、そのアセンブラ文法もLinuxスタイルですが
Intelスタイルも{$ASMMODE intel} をasmの前に入れるだけで書けます。
アセンブラの文法は殆ど同じになりますが、コメントはPascal式 //より右か {この範囲} か (* この範囲 *)
アセンブラだけで何かプログラムするとなればPICとか1チップマイコンくらいになりますから、高級言語の中に埋め込むという方式で入るのがお勧めの理由です。
私もLazarusでWin64環境を始めたので四苦八苦です=> Lazarusでアセンブラを使う時の注意点
asm文を使わなければ出来ない事は色々あります。
・前回のようにCPUIDを読んで自分のPCのCPUの種類や機能を調べる
・パスカル言語にSAR 演算子が無い事の対策
・64bit以上の多倍長演算(アセンブラならフラグを使えるので)
・X*Y/X のように途中で桁溢れする計算の計算可能範囲を広げる
・コンパイラが使ってくれないSIMD命令の利用
もっとも、最近はスクリプト言語が隆盛なので意味がないのかもしれませんけどね。
2023年02月25日
UTF8 ShiftJis EUC は先頭バイトだけで文字数が判ると知った
delphiを使ってからLazarusに移行する問題の1つが文字コードです。
(delphiはUTF16文字になってから移行しないままなので)
自作のツール類はShiftJISを想定しています。それらを移植しなけばいけません。
ちょっとしたコントロールも数値入力とかで四則演算出来るように作ったりしてる為です。
それで興味のなかった文字コードを調べていたわけですが
日本語で使われる UTF8 ShiftJis EUC は文字を順に読んで、そのも文字コードから1文字のバイト数が判るようになっていると知りました。
ShiftJis は当然最大2文字なので簡単 EUCは3バイトになる先行コードは1つだけ
そして UTF8も最初のバイトを見れば残り何バイトが必要かが判ります。
文字列処理といっても多くの場合、多バイト文字の中身は関係なく、多バイト文字である事が判れば十分です。
したがって、この3つは統一して処理出来そうです。
というような内容を文字列変換のページに追記しました
(delphiはUTF16文字になってから移行しないままなので)
自作のツール類はShiftJISを想定しています。それらを移植しなけばいけません。
ちょっとしたコントロールも数値入力とかで四則演算出来るように作ったりしてる為です。
それで興味のなかった文字コードを調べていたわけですが
日本語で使われる UTF8 ShiftJis EUC は文字を順に読んで、そのも文字コードから1文字のバイト数が判るようになっていると知りました。
ShiftJis は当然最大2文字なので簡単 EUCは3バイトになる先行コードは1つだけ
そして UTF8も最初のバイトを見れば残り何バイトが必要かが判ります。
文字列処理といっても多くの場合、多バイト文字の中身は関係なく、多バイト文字である事が判れば十分です。
したがって、この3つは統一して処理出来そうです。
ShiftJisは
OEMLeadBytes = [#$81..#$9F, #$E0..#$FC];
if c in OEMLeadBytes then 2byte else 1byte;
EUC-jpは
EUCLeadBytes = [#$8E,#$8F,#$A1..#$FE];
EUCLeadBytes3 = [#$8F]; //先頭文字が8Fなら合計3byte
if c in EUCLeadBytes then begin
if c in EUCLeadBytes3 then 3byte else 2byte;
end else 1byte
UTF8は
UTF8LeadBytes = [#$C2..#$DF, #$E0..#$EF, #$F0..#$F4];
UTF8LeadBytes2 = [#$C2..#$DF];
UTF8LeadBytes3 = [#$E0..#$EF];
UTF8LeadBytes4 = [#$F0..#$F4];
if c in UTF8LeadBytes then begin
if c in UTF8LeadBytes2 then 2byte
else
if c in UTF8LeadBytes3 then 3byte
else
if c in UTF8LeadBytes3 then 4byte;
end;
というような内容を文字列変換のページに追記しました
2023年02月24日
Lazarusで CPUIDで自分のPCのSSE対応状況を見る
SIMD命令を使ってみたくて、それには自分のPCでどのSSE/SVX命令に対応してるかどうか知る必要があります。
そこで書いてみました。結果、自分のPCは中古なのでSVX2まで対応でした。
それでも単精度の浮動小数点なら1度に8つの積+和が出来てしまいます。→ 実際にSIMD命令を使った関数
以下の使い方は GetSSE を呼び出すと列挙型が帰るので 使いたい命令があるかどうかは
if 使いたい命令 in GetSSE() then 〜
表示するなら対応する SSEname に文字列を用意しています。
昔にdelphiで作ったものを引っ張りだして修正したので sseに固執した名前付けだったり Lazarusなのにintelアセンブラ書式なのはご容赦下さい 。
以下がGetSSE
そこで書いてみました。結果、自分のPCは中古なのでSVX2まで対応でした。
それでも単精度の浮動小数点なら1度に8つの積+和が出来てしまいます。→ 実際にSIMD命令を使った関数
以下の使い方は GetSSE を呼び出すと列挙型が帰るので 使いたい命令があるかどうかは
if 使いたい命令 in GetSSE() then 〜
表示するなら対応する SSEname に文字列を用意しています。
var i: TSSEMODE; s:string;
begin
s:=''; for i := low(SSEname) to High(SSEname) do
if i in d then s := s + ' ' + SSEname[i];
昔にdelphiで作ったものを引っ張りだして修正したので sseに固執した名前付けだったり Lazarusなのにintelアセンブラ書式なのはご容赦下さい 。
以下がGetSSE
{$ASMMODE intel}
type
TSSEMODE = (sseSSE2, sseSSE3, sseFMA, sseSSE41, sseSSE42, sseAVX, sseAVX2, sseAVX512F, sseAVX512DQ);
TSSEMODEset = set of TSSEMODE;
const SSEname: array [low(TSSEMODE)..High(TSSEMODE)] of string =
('SSE2', 'SSE3', 'FMA', 'SSE41', 'SSE42', 'AVX', 'AVX2', 'AVX512F', 'AVX512DQ');
function GetSSE(): TSSEMODEset;
var iSZ, iDX, iCX, iBX: DWORD;
begin
asm
MOV EAX,0
CPUID
MOV iSZ,EAX
MOV EAX,1
CPUID
MOV iDX,EDX
MOV iCX,ECX
MOV EAX,7
MOV ECX,0
CPUID
MOV iBX,EBX
end ['EAX', 'ECX', 'EDX', 'EBX'];
if iSZ < 7 then iBX := 0;
Result := [];
if (iDX and (1 shl 26)) <> 0 then Include(Result, sseSSE2);
if (iCX and (1 shl 0)) <> 0 then Include(Result, sseSSE3);
if (iCX and (1 shl 12)) <> 0 then Include(Result, sseFMA);
if (iCX and (1 shl 19)) <> 0 then Include(Result, sseSSE41);
if (iCX and (1 shl 20)) <> 0 then Include(Result, sseSSE42);
if (iCX and (1 shl 28)) <> 0 then Include(Result, sseAVX);
if (iBX and (1 shl 5)) <> 0 then Include(Result, sseAVX2);
if (iBX and (1 shl 16)) <> 0 then Include(Result, sseAVX512F);
if (iBX and (1 shl 17)) <> 0 then Include(Result, sseAVX512DQ);
end;
2023年02月23日
Lazarusの文字化け対策
Lazarusの文字列はUTF8です。
そこにShiftJisを使おうとすると、最初の内はどうやっても勝手にUTF8になって文字化けして大変でした
windowsのコンソールアプリでwrite('漢字');でさえUTF8だから文字化けするのです
そしてShiftJisにいったん変換しても何かの呪いのように代入したり文字列連結すると文字化けする。
その仕組みがやっと分かりました。
LazarusのAnsiStringはコードページを変数内に持っていたのです。
そして文字定数はUTF8ですから文字列加算(連結)すればUTF8に変換されてしまう訳です。
そのあたりの細かい話をまとめてみました。
Lazarusの文字列変換
そこにShiftJisを使おうとすると、最初の内はどうやっても勝手にUTF8になって文字化けして大変でした
windowsのコンソールアプリでwrite('漢字');でさえUTF8だから文字化けするのです
そしてShiftJisにいったん変換しても何かの呪いのように代入したり文字列連結すると文字化けする。
その仕組みがやっと分かりました。
LazarusのAnsiStringはコードページを変数内に持っていたのです。
そして文字定数はUTF8ですから文字列加算(連結)すればUTF8に変換されてしまう訳です。
そのあたりの細かい話をまとめてみました。
Lazarusの文字列変換
タグ: 文字列
2023年02月22日
確定申告
実際に成功した やよい白色申告で確定申告するまので手順はコッチ
以下は確定申告出来るまでの迷走と愚痴
私の現在の職業は農家だ。
200a程の米作りと冬場はブロッコリ なすびを栽培してる。
母親が高齢で様子を見る必要もあり、採算度外視という状況で完全な赤字事業。
米は個別販売でもしなければ農協を通せば機械代も賄えない。
ブロッコリーは単位時間あたりの売上は良いが私は毎年のように失敗してあまり稼げていない
なすびも5a程なので稼げていないブロッコリーよりもさらに少ないが夏場は忙しい。
よって確定申告も やよいの白色申告オンライン でJAバンクと連携させて 保険の控除とかややこしい事をしないでも赤字だからと オンライン申告で納税ゼロ円。
で、今年も やよいの白色申告オンライン 確定申告操作をとマイナンバーを家族分入力したら、終わりと思っていたら、利用者識別番号と暗証番号を要求される。 利用者識別番号を知るには先にE-TAXにマイナンバーでログインしなければならない。 それをスマホでやろうとしたらE-TAXアプリは終了だからマイナポータルアプリを使えといわれて、その通りにしたら「データが変更されている可能性があります。再度ログインをして下さい。」でけっきょく繋がらない。
再度PCでICリーダーでE-TAXにログインして利用者識別番号は得られた。 が、マイページには何もない。電子申請したんだから名前とか住所くらい入っているべきだろうに。順に入力してゆくと チェックして出る画面で納税用確認番号 というのが設定出来るようなので、これが暗証番号かとやよい側に 入力してみたが、これも違うようだ。
再度 納税用確認番号 の所を見ると 納税用確認番号が消えているので また入力すると なんかエラーになってログアウトされたような画面。 ブラウザの戻るだけでもエラーになるので使い難い事、これ以上のものはないくらい。
というわけで まだ申告出来ていない。 とにかくページが重い。クリックにしても反応しない。 そして同じマイナンバーカードを受け付けるのにマイナポータルとEーTAXと申請先毎にアプリとブラウザへのインストールを要求される。
同じEーTAXなのに「受付」と「E-TAX」で別のセットアップが要求される。 管理者として実行が必要だからブラウザからエクスプローラーに戻らないといけない。で「E-TAX」の方は何度指示通りやってもインストールしろとはじかれる。インストール時間も結構長い。 結局 「変更等届出(個人の方用)利用者識別番号・暗証番号を忘れた方」を提出中という状況。これも「受付」の中からなら住所氏名年齢を入力しなくてすむのに外側でさせるからこうなる。
というか「受付」の中で暗証番号設定くらい出来るべきではないかと思う。
と書いた後で検索したら、出来るようだ。
しかし朝8時になると「ICカードリーダーで読み取り」の画面から先に進まない。 まあアクセスが集中するんだろうから仕方ないだろうけど。
結局 「ICカードリーダーで読み取り」ではなくスマホからのマイナポータルからQRコードを読み取ってログイン出来た。
以下は確定申告出来るまでの迷走と愚痴
私の現在の職業は農家だ。
200a程の米作りと冬場はブロッコリ なすびを栽培してる。
母親が高齢で様子を見る必要もあり、採算度外視という状況で完全な赤字事業。
米は個別販売でもしなければ農協を通せば機械代も賄えない。
ブロッコリーは単位時間あたりの売上は良いが私は毎年のように失敗してあまり稼げていない
なすびも5a程なので稼げていないブロッコリーよりもさらに少ないが夏場は忙しい。
よって確定申告も やよいの白色申告オンライン でJAバンクと連携させて 保険の控除とかややこしい事をしないでも赤字だからと オンライン申告で納税ゼロ円。
で、今年も やよいの白色申告オンライン 確定申告操作をとマイナンバーを家族分入力したら、終わりと思っていたら、利用者識別番号と暗証番号を要求される。 利用者識別番号を知るには先にE-TAXにマイナンバーでログインしなければならない。 それをスマホでやろうとしたらE-TAXアプリは終了だからマイナポータルアプリを使えといわれて、その通りにしたら「データが変更されている可能性があります。再度ログインをして下さい。」でけっきょく繋がらない。
再度PCでICリーダーでE-TAXにログインして利用者識別番号は得られた。 が、マイページには何もない。電子申請したんだから名前とか住所くらい入っているべきだろうに。順に入力してゆくと チェックして出る画面で納税用確認番号 というのが設定出来るようなので、これが暗証番号かとやよい側に 入力してみたが、これも違うようだ。
再度 納税用確認番号 の所を見ると 納税用確認番号が消えているので また入力すると なんかエラーになってログアウトされたような画面。 ブラウザの戻るだけでもエラーになるので使い難い事、これ以上のものはないくらい。
というわけで まだ申告出来ていない。 とにかくページが重い。クリックにしても反応しない。 そして同じマイナンバーカードを受け付けるのにマイナポータルとEーTAXと申請先毎にアプリとブラウザへのインストールを要求される。
同じEーTAXなのに「受付」と「E-TAX」で別のセットアップが要求される。 管理者として実行が必要だからブラウザからエクスプローラーに戻らないといけない。で「E-TAX」の方は何度指示通りやってもインストールしろとはじかれる。インストール時間も結構長い。 結局 「変更等届出(個人の方用)利用者識別番号・暗証番号を忘れた方」を提出中という状況。これも「受付」の中からなら住所氏名年齢を入力しなくてすむのに外側でさせるからこうなる。
というか「受付」の中で暗証番号設定くらい出来るべきではないかと思う。
と書いた後で検索したら、出来るようだ。
しかし朝8時になると「ICカードリーダーで読み取り」の画面から先に進まない。 まあアクセスが集中するんだろうから仕方ないだろうけど。
結局 「ICカードリーダーで読み取り」ではなくスマホからのマイナポータルからQRコードを読み取ってログイン出来た。
2023年02月21日
ロータリーエンジンの曲線
前回、サイクロイド曲線によるポンプ曲線をJavaScriptで描いたので、ロータリーエンジンの曲線に挑戦してみました。
外側はトロコイド曲線 ですがローターは計算式で表現が難しい曲線です。
包絡曲線を微分方程式で解く方法もあるようですが、データを回転させながら地道に削ってゆく処理で得ています。
内側を固定して外側を回転させる図を用意しています
外側はトロコイド曲線 ですがローターは計算式で表現が難しい曲線です。
包絡曲線を微分方程式で解く方法もあるようですが、データを回転させながら地道に削ってゆく処理で得ています。
内側を固定して外側を回転させる図を用意しています
2023年02月19日
PascalコードをJavaScriptへ変換する補助機能
サイクロイド曲線とかトロコイド曲線を描くのにJavaScriptを使ったのですが、
回転変換が入りまくるのでPascalで検証してからJavaScriptに変換してるわけです。
変換といっても、短いコードなら簡単なのですが、長くなると結構厄介です。
特にPascalだと begin end を {} に置換する必要もあり一から書くのと同等かもしれません。
構造体を使うとJavaScriptに直すのに厄介だから配列だけにしてと工夫はしてるのですけどね。
LazarusにはPas2JS.exe という PascalコードをJavaScriptに変換してくれるツールも付いているのですが
全体をJavaScript環境で動くように変換してくれるため、一部のコードだけというのは逆に面倒。
それで1回目の作業でやってた置換作業を組み込んだツールを作りました。
begin end の置換の他 for while if と型定義を外してくれます。
自分のコードを変換する目的だから、それ以外の範囲には対応していません。
例えば、変換結果に対して 配列なら var a; と型定義が外れているだけなので var a=[]; と手直しが必要になります。
pascalだと変数定義を先頭でしてるのですが、それをJavaScriptに持ち込むと先頭に変数定義がならんで汚いので ローカル変数定義部は消して letを適当に入れるようにしています
まあwindowsのexeなので警告が出てexeはダウンロード出来ないかもしれません。
ソースも置いてあるので使いたい人はどうぞ。=> ClipBd電卓
回転変換が入りまくるのでPascalで検証してからJavaScriptに変換してるわけです。
変換といっても、短いコードなら簡単なのですが、長くなると結構厄介です。
特にPascalだと begin end を {} に置換する必要もあり一から書くのと同等かもしれません。
構造体を使うとJavaScriptに直すのに厄介だから配列だけにしてと工夫はしてるのですけどね。
LazarusにはPas2JS.exe という PascalコードをJavaScriptに変換してくれるツールも付いているのですが
全体をJavaScript環境で動くように変換してくれるため、一部のコードだけというのは逆に面倒。
それで1回目の作業でやってた置換作業を組み込んだツールを作りました。
begin end の置換の他 for while if と型定義を外してくれます。
自分のコードを変換する目的だから、それ以外の範囲には対応していません。
例えば、変換結果に対して 配列なら var a; と型定義が外れているだけなので var a=[]; と手直しが必要になります。
pascalだと変数定義を先頭でしてるのですが、それをJavaScriptに持ち込むと先頭に変数定義がならんで汚いので ローカル変数定義部は消して letを適当に入れるようにしています
まあwindowsのexeなので警告が出てexeはダウンロード出来ないかもしれません。
ソースも置いてあるので使いたい人はどうぞ。=> ClipBd電卓
2023年02月14日
学生の頃の夢 サイクロイドロータリー
学生の頃、専門は機械工学でした。
ロータリーエンジンに憧れまして、あれはトロコイド曲線なのですが、サイクロイド曲線の方が摩擦も少なく性能が良いものが作れるのではと妄想していました。
30年以上前に作っていたサイクロイドポンプ曲線を表示するツールを作り直して思い出に浸っています
上記の動いてるものはJavaScriptで作ったもの。
同じものやWindowsのexeは 作ったwindowsEXEの場所
こんな曲線を螺旋にして圧縮機と膨張を別にするエンジンとか
スポンジで作って掃除機を作るとか
お金があればやってみたいですね