SME日記その4 Streaming SVE modeでCNTWを実行してみる.に寄せられたコメントを踏まえて,再考してみます.
SMEシリーズ
- Apple Silicon M4はM3シリーズからScalable Matrix Extension (SME)命令などが足されている
- SME日記その1: Apple Silicon M4に搭載されたScalable Matrix Extension(SME)のベクトル長(SVL)を取得する
- SME日記その2: Apple Silicon M4にはCVTW命令は備わっていない?
- SME日記その3: Apple Silicon M4にどの命令が実装されているかをsysctl hwの実行結果とドキュメントから推測する
- SME日記その4 Streaming SVE modeでCNTWを実行してみる.
- SME日記その5 Streaming SVE modeでCNTWを実行してみる Part 2
- SME日記その6 Streaming SVE modeでsvcntw()とsvcntsw()を実行してみる
- SME日記その7 svcntw()とRDSVL命令の実行結果の関係性を考察する
- SME日記その8 __arm_new("za")について調べる
- SME日記その9 OpenBLASのSME対応状況について調べる
いただいたコメント
推測を外したお詫び(?)にこの記事の実行結果をちゃんと説明しておくと、まず、Streaming SVE Modeへの切り替えは正しく行われます。そして、Streaming SVE Modeで printf が実行され、その内部で実行される浮動小数点命令がStreaming SVE Modeに対応していないのでSIGILLになります。デバッガーを使えば一発でわかります。
printf の内部でクラッシュするのは、(理由は違いますが)x86-64でアセンブリー言語を書くプログラミングをしているとたまに遭遇するので、懐かしい気分になりますね。
検証プログラムコード
cntw.c
#include <stdint.h>
#include <stdio.h>
void smstart()
{
asm volatile ("smstart sm");
}
void smstop()
{
asm volatile ("smstop sm");
}
uint64_t cntw()
{
uint64_t count;
asm volatile ("cntw %0"
: "=r"(count)
);
return count;
}
int main()
{
smstart();
uint64_t c = cntw();
smstop();
printf("%llu\n", c);
}
コンパイル方法
clang -O2 -march=armv9-a+sme -o cntw cntw.c
実行の方法と結果
% ./cntw
16
まとめ
お騒がせしました.確かにprintf
をStream SVE Mode の外に追い出せば,実行できました.これは注意しないといけないですね.
そして,デバッガを使うことも大事...