ARM NEONのCompile設定が分からない
先般
Zynqで割り込みが不調
というタイトルの投稿をしたgammodlerと申します。
英語サイトに投稿するつもりが、誤って日本語サイトを選択してしまいました。
急きょ日本語に変更、数々のおきて破り申し訳ありません。
nekketsuuu様 kunif様
コメントおよび添削までしていただいて恐縮しております。
以降は注意して投稿いたします。
まだ『おきて破り』があるかもしれません。ご指摘ください。
arm7-cortex9にあるNEONというDSP機能を使おうとしています。
以下の記事を参考に作業をしており、以後これをTutorialと呼びます。
ARM NEON intrinsic を書く - Qiita
その中の以下コマンドを実行しようとしてさっそくつまづきました。
raspberrypi:~/tmp> gcc -S add.c -mfpu=neon -march=armv7-a -O3
Raspberry PiというのはHardware Platformの名称で、質問者はこれと類似性の高いMicroZedというものを使用しています。
どちらもXilinx社のZynq-7000というchipを使用、cpuはarm7-cortex9です。
Tutorialではgccのoptionとして
-mfpu=neon -march=armv7-a
を指定していますが、Xilinx社が発行するDocumentではこれを
-mcpu=cortex-a9 -mfpu=neon
とするよう指定しています。そこで
-$ gcc -S add.c -march=cortex9 -mfpu=neon -O3
を実行してみました。すると
unrecognized command line option -mfpu=neon
が出てしまいました。add.c
のソースコードは末尾にあります。
-march=cortex9(armv7-a)
は受け付けるが
-mfpu=neon
は拒絶、という結果になりました。
gccのVersionが関与している可能性を探りました。
質問者のOSはCentOS7
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39)
です。
Ubuntuでも試みてみました:
gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
これもNGでした。
一方Tutorialでは
gcc (Raspbian 4.9.2-10) 4.9.2
Tutorialにはこの件に関しcommentはなく、問題になっていないようです。
なお、RaspbianというのはOSのようです:
https://ja.wikipedia.org/wiki/Raspbian
そこでRaspbianでGO(?)であることを頼りに解決策を探った結果、この問題に最も触ると思われる
https://www.raspberrypi.org/forums/viewtopic.php?t=139091#p1059230
を発見しました。
しかし問題提起者がGOに至ったわけでもないようです。
このなかでneonについてもVersion指定が必要との指摘がありました。
その他、option指定方法にも工夫があるらしいことが分かりました。
そこで、実際に使用されているCPUの詳細をチェックして、
-$ gcc -S add.c -march=cortex9 -mfpu=neon-vfpv3 -O3
あるいは
-$ gcc -S add.c -march=cortex9 -mfpu=neon-vfpd32 -O3
を試みましたが、いずれもNGでした。
cpuの詳細はTarget側にある/proc/cpuinfoから取得しました:
root@prg:/proc# cat cpuinfo
processor : 0
model name : ARMv7 Processor rev 0 (v7l)
BogoMIPS : 1332.01
Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpd32
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x3
CPU part : 0xc09
CPU revision : 0
processor : 1
model name : ARMv7 Processor rev 0 (v7l)
BogoMIPS : 1332.01
Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpd32
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x3
CPU part : 0xc09
CPU revision : 0
Hardware : Xilinx Zynq Platform
Revision : 0003
Serial : 0000000000000000
root@prg:/proc#
arm-cortex9でのneonの機能は多数使用されていると思います。
gccのVersion down?これがあれば全世界で問題噴出?
必要なconfigを実行していないなど、のミスがあるのかもしれません。
解決に至る示唆をいただければ幸いです。
add.c
#include <arm_neon.h>
#include <stdio.h>
int main(int argc, char ** argv)
{
uint32x2_t vx, vy, vz;
uint32_t x[2] = {2, 4};
uint32_t y[2] = {4, 8};
uint32_t z[2];
vx = vld1_u32(x);
vy = vld1_u32(y);
vz = vadd_u32(vx, vy);
vst1_u32(z, vz);
printf("z: %u %u\n", z[0], z[1]);
}