2017/01/27

[rpi]Pi1/2のどちらでも動かしたいときはコンパイルオプションに注意

Raspberry Piのgithubでは、クロスコンパイラが4種類置いてある。
どれを使うのがよいかは、むかし調べて、どれでもいいんじゃないの、で終わらせた。
hiro99ma blog: [rpi]クロスコンパイラはどれがよいのだろう

 

しかし、先日、ちょっと考えねばならんことがあった。
「ARM版」ということでバイナリ公開されているツールがあってダウンロードしたのだが、Raspberry Pi2では動くものの、Pi1ではちらりとも動かなかったのだ。

Illegal instruction

結局ソースからビルドし直し、動くものはできた。
このときは「arm-rpi-4.9.3-linux-gnueabihf」を選んだのだが、その理由はちょうどcommitコメントに「with Pi 1 support」と入っていたからだった。

 

Pi1はARM11、Pi2はCortex-A7のようだ。
ARM11はARMv6、A7はARMv7ということで、使える命令はv7の方がちょっと多い。
その部分が「命令不正」ということで、Illegal instructionを引き起こしているのだろう。

 

ARM Cortex-A Processors and GCC Command Lines - Blog - Software Tools - ARM Community

NEONというSIMDのコプロセッサみたいなものが載っていて、その命令が生成されたのか。
SIMDは1命令で複数の並列計算を行うようなイメージだ。
座標の変換に行列計算をしたりするけど、ああいうのを1命令でできるとか、そんな感じだ。
PentiumでいうところもMMXとでも思っておけばよいだろう。

 

こちらもリンクを載せておこう。
KMC Staff Blog:ARMのNEONのSIMD命令をgccのオートベクタライズの最適化で使う方法
-mfpu=neonと付けておけば、最適化オプションでうまいことやってくれたりするようだ。

 

ということは、くだんのバイナリは-mfpu=neonでビルドされていたということだろうか。
だったら、クロスコンパイラは好きなのを選んでよいという結論は変わらんのか。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。