RustにいればRustに従え(12) まずはspawnとchannelでマルチスレッド。

spawnParallel
Joseph Halfmoon

前回は素朴な2次元ループ、勿論シングルスレッドで行列積を求めました。今回はこれに手をいれてマルチスレッド化してみたいと思います。調べたところ「データ並列を活用」するrayonクレートというものが魅力的だったのですが、今回はRustのフツー?のthreadを使ってRust風の並列化を学んでいきたいと思います。 “RustにいればRustに従え(12) まずはspawnとchannelでマルチスレッド。” の続きを読む

ぐだぐだ低レベルプログラミング(112)ARM64(AArach64)積和は”fused”

fused_result
Joseph Halfmoon

今回から浮動小数の積和演算に入ります。「掛けた結果を足しこむ」積和演算は、積分というかコンボリューションというか、信号処理かAIか、近代的な各種アルゴリズムで多用される演算です。何万回どころか何億回も。そのような計算を高速化してくれる積和演算命令ですが、普通に掛けてから足すのとは結果が微妙に違うことがあると。ホントか?
“ぐだぐだ低レベルプログラミング(112)ARM64(AArach64)積和は”fused”” の続きを読む

ぐだぐだ低レベルプログラミング(111)ARM64(AArach64)FRINTx

frintResults
Joseph Halfmoon

前回前々回と浮動小数点レジスタと整数レジスタの間での整数/固定小数点数変換をエクササイズしてきました。しかし今回は浮動小数点レジスタ間での「整数変換」です。フォーマット上は浮動小数、でも中身は整数ピッタンコの値というやつ。またまたメンドイ「丸め」が登場して命令ニーモニック数が激増。A64ホントに命令多いな。 “ぐだぐだ低レベルプログラミング(111)ARM64(AArach64)FRINTx” の続きを読む

ぐだぐだ低レベルプログラミング(110)ARM64(AArach64)SCVTF、UCVTF

SCTVFUCVTFresults
Joseph Halfmoon

前回まで浮動小数点数を整数または固定小数点数に変換するFCVT命令群を練習してきました。今回は逆、整数または固定小数点数を浮動小数点数に変換するSCVTF(符合付整数から)、UCVTF(符合無整数から)命令です。そんなん簡単じゃろう、と思うと意外とメンドイ奴らであります。元は整数なのに「丸め」が関係してくる、どゆこと?
“ぐだぐだ低レベルプログラミング(110)ARM64(AArach64)SCVTF、UCVTF” の続きを読む

ぐだぐだ低レベルプログラミング(109)ARM64(AArach64) FCVT、固定小数点

fxp_format_example
Joseph Halfmoon

前回のFCVT命令群は浮動小数点数を整数に変換するものでした。今回のFCVTは浮動小数点数を固定小数点数に変換する命令です。ハード上は整数、でも小数点位置を心の中に秘めて?いるもの。デジタル信号処理では必須。プログラマが小数点位置を管理しないとならないのでメンドイですが高速に計算できます。

“ぐだぐだ低レベルプログラミング(109)ARM64(AArach64) FCVT、固定小数点” の続きを読む

ぐだぐだ低レベルプログラミング(108)ARM64(AArach64)FCVTxy、整数変換

fcvt2Result
Joseph Halfmoon

前回は単精度と倍精度の間のフォーマット変換を行うFCVT命令でした。同じ命令が丸めモードの設定で動作が変わるので厄介でした。今回のFCVTxy命令群(xyのところはいろいろ)は、浮動小数点数を整数に変換するもの。丸めモードフラグには関係なしと喜んだら、かえって組み合わせが増えているでないの?もうメンドくてやりきれない?
“ぐだぐだ低レベルプログラミング(108)ARM64(AArach64)FCVTxy、整数変換” の続きを読む

ぐだぐだ低レベルプログラミング(107)ARM64(AArach64)FCVT

fcvt_asm
Joseph Halfmoon

今回はたった1命令、FCVTをエクササイズしてみます。練習に使っているArm Cortex-A72は半精度浮動小数のサポートが無く、以前残念に思ってましたが、今回は無くて良かった、という感じです。単精度があったら組み合わせは3倍、やめてくれです。前回登場のFPCRレジスタのRMビットが活躍します。
“ぐだぐだ低レベルプログラミング(107)ARM64(AArach64)FCVT” の続きを読む

ぐだぐだ低レベルプログラミング(106)ARM64(AArach64)FPSR/FPCR

A64_FPCR_FPSR
Joseph Halfmoon

何時までも見て見ぬふりもできないので今回はFPSRとFPCRを調べてみたいと思います。命令ニーモニックではありませぬ。フローティングポイントステータスレジスタとコントロールレジスタ、「メンドイ」浮動小数の例外やら非数(NaN)などの制御とそのステータスを保持するもの。今回はレジスタのビットの配置から。 “ぐだぐだ低レベルプログラミング(106)ARM64(AArach64)FPSR/FPCR” の続きを読む

ぐだぐだ低レベルプログラミング(105)ARM64(AArach64)FMOV

FMOV
Joseph Halfmoon

今回はFMOV命令です。浮動小数点数の転送命令。浮動小数点といっても何の変換操作もなし、単なるビットパターンのコピーです。命令はたった一つFMOV。しかしこれが意外に面倒デス。今回でも組み合わせが多いのに、ターゲットマシンが半精度を使える機種だったらもっとやらないといけなかったです。頭文字Fの命令にチョロイのはいない。
“ぐだぐだ低レベルプログラミング(105)ARM64(AArach64)FMOV” の続きを読む

ぐだぐだ低レベルプログラミング(104)ARM64(AArach64)FABS、FSQRT他

fabsnegsqrtResults
Joseph Halfmoon

今回はFloating-point arithmetic(one source)のカテゴリを一気にやります。といっても3命令、FABS、FNEG、FSQRTです。例外とか「コマケー話」を避けていれば浮動小数点の演算そのものは素直で分かりやすい?です。そのうちメンドイ話もやらんといかんですが、今回は無し。平穏無事。。 “ぐだぐだ低レベルプログラミング(104)ARM64(AArach64)FABS、FSQRT他” の続きを読む

オプション沼(7) gccに-staticオプション、できたファイルはデカいのよ。

lddTestStatic
Joseph Halfmoon

前回はリンクの手前で止める-cオプションでした。今回はリンクするのだけれど、普段あまり使わない「スタティック・リンク」の -static オプションです。普段のベアメタルな組み込み開発なら「スタティック・リンク」ですが、わざわざオプション付けたりしないしな~。使う局面は極めて限定的かと。知らんけど。 “オプション沼(7) gccに-staticオプション、できたファイルはデカいのよ。” の続きを読む

ぐだぐだ低レベルプログラミング(103)ARM64(AArach64)FSUB、FMUL他

FP_SUB_EC
Joseph Halfmoon

前回はFADD命令をさわり、ARMv8p0には半精度浮動小数点型が無かったというお間抜け発覚。今回はFADD以外のFloating-point arithmetic (two sources)の残りFSUB, FMUL, FNMUL, FDIVであります。まあ、以下同文っていう感じなんでありますが。単精度と倍精度。

“ぐだぐだ低レベルプログラミング(103)ARM64(AArach64)FSUB、FMUL他” の続きを読む

ぐだぐだ低レベルプログラミング(102)ARM64(AArach64)FADDと半精度

fpError
Joseph Halfmoon

前回、浮動小数点レジスタのお名前一覧など図にしておったので半精度浮動小数が使える、と頭から信じておりました。しかし今回気づきました。これがArmv8でもv8.2からの拡張であることを。つまり手元のラズパイ4のCortex-A72(Armv8p0)では使えないようです。トホホ。ということで倍精度、単精度のみの練習とな。 “ぐだぐだ低レベルプログラミング(102)ARM64(AArach64)FADDと半精度” の続きを読む

オプション沼(5) gccに-Sオプションつけて、アセンブラ出力を愛でてみる

optS_EC
Joseph Halfmoon

今回は gcc の -S オプションを使ってみます。「もっとも狭義の」コンパイル、アセンブリ言語ソース生成までで処理を止めるもの。コンパイラのお仕事を途中で止めておくオプションでも -c はよく使うとおもいますが、-Sはあまり使わない気がします(個人の感想デス。)アセンブリ言語ソースを読まねばいられない人は別にして。

“オプション沼(5) gccに-Sオプションつけて、アセンブラ出力を愛でてみる” の続きを読む