Mac で学ぶ Arm アーキテクチャ 1-2
前回、唐突にアセンブラ言語から入ったわけであるが、アセンブラ言語で注意しなければいけない点はなんだろうか?
よく言われていることだが、アセンブラは抽象度が低い。
C++ はいうに及ばず、比較的低レイヤーの操作を得意とする C でも普通にコーディングする際にはハードを意識する必要はほとんどない。
この事情は 1-1 からでも伺えるであろう。
CPU のアーキテクチャが x86-64 であっても arm であっても、(当たり前だが)C のコードは一緒でいい。アーキテクチャの違いをコンパイラーが吸収してしまからだ。
ところが、アセンブラは、命令セットなどは基本的には CPU に依存するため、CPU の仕様が頭に入ってないとまとまったプログラムを組むのは難しい。
つまり、汎用性のあるアセンブリ言語というものは存在せず、
・arm に対応したアセンブリ言語
・x86_64 に対応したアセンブリ言語
がそれぞれ存在している、というのが実態なのだ。
幸運なことに MacOS に入っている clang はアーキテクチャを指定することで、x86_64 向け・arm 向けのアセンブラを出力できるので、arm 向けのアセンブラ出力から arm のアーキテクチャを探っていくことにする。
なお、一口に arm といっても、型番によって微妙に違いがある。
例えば、v7 までは 32bit CPU だが、v8 は 64bit である。
ここでは Mac を前提にしているので、特に断らない限り cortex シリーズを前提に話を進めていく。
long brief pulse ECT とかいう手法
久々に某研究者交流サイトに入ったら、以前書いた症例報告がまた引用されているとのお知らせが。
引用元は ECT のケースシリーズ(↓)のようで
Katagai H, Yasui-Furukori N, Kawashima H, Suwa T, Tsushima C, Sato Y, et al.
Serial case report of high seizure threshold patients that responded to the lengthening of pulse width in ECT.
Neuropsychopharmacol Rep. 2021;00:1– 4.
references を調べると
あ、ありましたね。
著者の中に Shimoda とあるので獨協大の下田先生かな?と思ってたら、そうでした(某 SNS サイトで軽く盛り上がる)。
京大の先生方もいつもいつも私の名前を出してもらってありがとうございます。
内容に関していうと、この症例報告のキモは以下の figure です。
通常の設定で良質なけいれん波が得られない
→麻酔科的工夫(過換気、薬剤投与量↓)はダメ
→テオフィリンを前投与してもダメ
→Pulse Width を 1.5ms に変更したらほぼほぼ十分なけいれん波が得られた
という流れ。
Pulse width に加えて Frequency を変えたり変えなかったりしてるんですが、この効果はこれだけだとはっきりわかりません。
細かい話すると、川嶋先生は(どちらかといえば) frequency 変える派、私は変えない派です。
というか、初期の段階では、パラメータ変えまくると何が効いているのか分かりにくくなってしまうので、Pulse Width のみ変えていた、という事情があります(結果的に duration も変わりますが)。
猪股弘明
精神科医(精神保健指定医)
日本精神神経学会ECT・rTMS等検討委員会委員
(追記)「こちらにも引かれてますよ」と某先生が教えてくれた。
Is increasing the pulse width from 0.5 to 1 ms an effective strategy to optimize clinical and electrical outcomes in bilateral ECT treatment?
Clara Massaneda-Tuneu et al
思いっきり PCN 誌じゃん。購読はしているのに…。
Editor に対する Letter なので見落としてたな。
確かに。
ちなみに著者陣はスペインの人たちらしい。
広まっているものですね。
内容に関しては触れないが、
However, further research with larger samples and randomized clinical trials are warranted to demonstrate this clinical observation.
とあるように、long brief pulse の RCT を求める声はちらほら聞く。
Linux カーネルのソースコード
気にはなっていたのだが、今まで linux カーネルのソースコードを読んだことはなかった。
現在(2022 年頭)、ソースは2700万行くらいらしく、全部を読むのは無理。
『動かしながらゼロから学ぶ Linuxカーネルの教科書』
が、導入書としては結構良書だったので、それを手がかりにして GitHub のソースを漁る。
https://github.com/torvalds/linux/blob/master/init/main.c
が、まず最初に実行される main 関数。
アイキャッチは、ページ機能の init (初期化)をおこなっている箇所。(これでメモリが使えるようになるわけです)
関数名からカーネルが何やっているか大体想像はつくと思うが、書き方がすっきりしてますね。
だからどうしたと言われればそれまでなんですが、たとえば、医療機器を超高速で制御したいときなんて、カーネルに手を加えた方がいい場合が多い(はず)なので、担当者にはそれくらいの知識・経験を要求しますね、私なら。
Mac で学ぶ Arm アーキテクチャ 1-1
実行したら 10 を返す
int main(void){
return 10;
}
という C プログラムを
・intel Mac 向け
・M1 Mac 向け
にそれぞれアセンブラで「寸止め」コンパイルして出力させてみた。
すぐに気がつくのは
・レジスタの名称が全然違う
・M1 向けの方が若干すっきりしている
あたりだろう。
ところで、これを某所でネタにしたら「どうやってアセンブラ出力させたんですか?」という質問があった。
じゃあ、これ、クエスチョンにしますか。
Q1.1 C プログラム(ここでは test.c とします)を Mac 上で clang を使って
・x86_64 アーキテクチャ向け
・arm64 アーキテクチャ向け
にそれぞれアセンブラ出力(testx86.s と testarm.s)させるコマンドをそれぞれ作ってください。
ついでにこれも。
Q1.2 どちらのアーキテクチャでも良いが test.c の実行ファイル(test)を作成してください。
このとき実行ファイルを実行させても端末には何も表示されません。
この時の main 関数の返り値 10 を(ソースに手を加えずに)端末上に表示させるにはどのようなコマンドを用いたら良いでしょう?
解答は近いうちにアップします。
解答はこちら。