ぐだぐだ低レベルプログラミング(163)ARM64(AArach64)SIMD 転置命令

Transpose4x4
Joseph Halfmoon

今回はSIMD命令の華「transpose」命令の実習をしたいと思います。転置デス。行列にはつきもののアレです。「簡単な操作」なのでメモリ上の要素をループで読んで順序を変えて書き戻せば可能。でもメモリにアクセスする時間を考えると大変。しかしA64のTRN1、TRN2を使えばレジスタ上で転置ができてしまうっと。
“ぐだぐだ低レベルプログラミング(163)ARM64(AArach64)SIMD 転置命令” の続きを読む

ぐだぐだ低レベルプログラミング(162)A64(AArach64)SIMD permute

ZipUzpDiag
Joseph Halfmoon

今回からSIMDレジスタ2個の内容を「混ぜあわせて並び変える」permute命令群の練習に入りたいと思います。SIMD命令でプログラムを書こうとすると避けて通れないどころか、ここの始末のエレガントさで性能段違いっす。まさにSIMDの華というべきか。ホントか?誰が言った?今回はその露払いね。 “ぐだぐだ低レベルプログラミング(162)A64(AArach64)SIMD permute” の続きを読む

ぐだぐだ低レベルプログラミング(161)A64 SIMD要素毎SQDMLAHはARMv8.1

ASMerror
Joseph Halfmoon

今回こそ「SIMDレジスタの一方の全要素に他方の一要素を共通に掛け算」する命令の練習を完了せんとしたところ、既に完了していることに気づいて愕然。お楽しみにとっておいた「符号付整数の乗算結果を2倍して積和した結果の上側半分を丸めて格納、もし溢れたらサチュレーション」は実習不可。それどころかあちこち要訂正。トホホ。

“ぐだぐだ低レベルプログラミング(161)A64 SIMD要素毎SQDMLAHはARMv8.1” の続きを読む

ぐだぐだ低レベルプログラミング(160)A64 SIMD要素毎SQDMLAL(題訂正)

simd_elemSQDMLALresults
Joseph Halfmoon

前回に続き「SIMDレジスタの一方の全要素に他方の一要素を共通に掛け算」する命令の練習です。今回は「符号付整数の乗算結果を2倍した上で倍のビット幅のレジスタに積和もしくは積差を行った結果が溢れたらサチュレーションさせる」命令を練習してみます。まあ何度となくメンドクセー奴らを練習してきたのでこのくらいはなんてことない? “ぐだぐだ低レベルプログラミング(160)A64 SIMD要素毎SQDMLAL(題訂正)” の続きを読む

ぐだぐだ低レベルプログラミング(159)A64(AArach64)SIMD要素毎FMULX

elemFMULXargs
Joseph Halfmoon

前回につづき「SIMDレジスタの一方の全要素に他方の一要素を共通に掛け算」する浮動小数点演算命令を練習しようとして発覚。FMLAL, FMLAL2, FMLSL, FMLSL2の4命令、ARMv8.2以降の実装です。ARMv8.0では練習できません。ラッキー?残りはと見ればFMULXのみ。しかしメンドクセー奴なんだ。
“ぐだぐだ低レベルプログラミング(159)A64(AArach64)SIMD要素毎FMULX” の続きを読む

ぐだぐだ低レベルプログラミング(158)ARM64(AArach64)SIMD要素毎FMUL

elemFMULresultsEC
Joseph Halfmoon

「SIMDレジスタの一方の全要素に他方の一要素を共通に掛け算」する系統の命令があまりに数が多いです。前回それらを表にまとめました。今回はそれらの中から「シンプル」な浮動小数の乗算、積和算、積差算を練習してみたいと思います。シンプルとは言え積和が出てくると fused計算を避けて通れませぬ。fusedの効果確認メンドい

“ぐだぐだ低レベルプログラミング(158)ARM64(AArach64)SIMD要素毎FMUL” の続きを読む

ぐだぐだ低レベルプログラミング(157)ARM64(AArach64)SIMD 要素毎MUL

elemEC
Joseph Halfmoon

前回、SIMDレジスタの全要素に、別なSIMDレジスタの1要素を乗じる形の命令を練習しました。この「全要素に他方の一要素を共通で掛け算」する系統の命令は実に33種あり(前回の3種含む)、忘却力の老人が覚えきれるものではありませぬ。そこで今回は一覧表を作って「整理」してみたのだけれど、ダメだ、こんがらがる。。。

“ぐだぐだ低レベルプログラミング(157)ARM64(AArach64)SIMD 要素毎MUL” の続きを読む

ぐだぐだ低レベルプログラミング(156)ARM64(AArach64)SIMD MUL

MULresults
Joseph Halfmoon

SIMDの「整数変換系」まだあると思ったらFRINT32X一族はARMv8.0には存在せず。ラッキー?前回で整数変換系の練習は終わりであります。そこで次の単元?に入ったですが、今度はSIMDのMUL系、まだ練習してないことに気づきました。もっとムツカシー奴らは練習していたのにシンプルなMULやってなかったのね。。。

“ぐだぐだ低レベルプログラミング(156)ARM64(AArach64)SIMD MUL” の続きを読む

ぐだぐだ低レベルプログラミング(155)ARM64(AArach64)SIMD FCVTxy

FCVTzpm
Joseph Halfmoon

前回は浮動小数を浮動小数フォーマットのまま整数に丸めるFRINTx命令でした。今回は浮動小数を丸めて「ホンモノの」整数表現に変換してしまうFCVTxy命令です。前回は丸めモードフラグに影響される命令が2個ありましたが、今回は相当する命令はありません。命令減ったの?とみれば増えとります。変換先が2種類あるから。
“ぐだぐだ低レベルプログラミング(155)ARM64(AArach64)SIMD FCVTxy” の続きを読む

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

FRINTX_EC
Joseph Halfmoon

前回につづき今回も勝手命名「SIMD整数変換系」の命令の練習です。浮動小数値を浮動小数形式のまま整数に丸めるもの。メンドイので後回しにしたかった奴ら。浮動小数に「つきもの」の丸めモロだしです。丸めの差が見えるように入力値を選ばねばならないけれど、一部の結果はステータスフラグまで見に行かないとわかりませぬ。メンドイ。

“ぐだぐだ低レベルプログラミング(155)ARM64(AArach64)SIMD FRINTx” の続きを読む

ぐだぐだ低レベルプログラミング(154)ARM64(AArach64)SIMD from整数

SCVFresults
Joseph Halfmoon

前回はSIMD「整数変換系」と勝手に称して表をまとめるだけで疲れてしまい、実習なしでした。今回は実習編。整数から浮動小数への変換命令の練習です。ニーモニック的には前回の巨大な表の末尾の2個だけです。浮動小数からの変換命令がそれだけ多いということだけれども、整数からの変換にも多少は凸凹あり。それほど単純ではありませぬ。 “ぐだぐだ低レベルプログラミング(154)ARM64(AArach64)SIMD from整数” の続きを読む

ぐだぐだ低レベルプログラミング(153)ARM64(AArach64)SIMD 整数変換系

FRINTtableEC
Joseph Halfmoon

メンドクセーのでなるべく後回しにしていたのですが、やる順番です。勝手命名、SIMD「整数変換系」です。浮動小数の数値を「整数」に変換したりその逆をするもの。前回が浮動小数の数値のフォーマット変換(単精度から倍精度とか)であったのでここでやっとかないとイケない感じ。毎度のことですが叫ばざるを得ません。命令多過ぎA64と。

“ぐだぐだ低レベルプログラミング(153)ARM64(AArach64)SIMD 整数変換系” の続きを読む

ぐだぐだ低レベルプログラミング(152)ARM64(AArach64)SIMD FCVTL

FCVTL
Joseph Halfmoon

前回は勝手命名SIMD抽出系、SIMDの整数要素のビット幅が狭くなる命令群でした。今回はFCVTL一族です。SIMDの浮動小数要素に作用し、浮動小数フォーマットを広く、あるいは狭くするものどもです。ARMv8p0の場合、単精度と倍精度の間の変換だけなのでお気楽。でもコマケーこだわりの命令もあるよ。 “ぐだぐだ低レベルプログラミング(152)ARM64(AArach64)SIMD FCVTL” の続きを読む

ぐだぐだ低レベルプログラミング(151)ARM64(AArach64)SIMD 抽出系

xtn
Joseph Halfmoon

前回はSIMD要素のビット幅が倍になる勝手命名「拡張系」の皆さんでした。今回はSIMD要素のビット幅が半分になる勝手命名「抽出系」の皆さんです。逆方向だから前回の逆で4命令かと思えば、倍の8命令もあります。サチュレーションとかいろいろあるのよ抽出系。符号もちょいと捻くれたものもあるし。それにしても命令多過ぎA64。
“ぐだぐだ低レベルプログラミング(151)ARM64(AArach64)SIMD 抽出系” の続きを読む