##開発環境を整備
とりあえず,neon命令を吐き出すコードをコンパイルしなきゃ話にならんので,開発環境を整備する.
基本的にintrinsic関数を使って開発するので,ubuntuならば以下のように適当にarm用のgccを導入しておけば多分大丈夫.(なんか色々と関係ないパッケージも一緒に入れた気がするので実は不十分かも)
% sudo apt-get install gcc-4.6-arm-linux-gnueabi
##qemuを導入
qemuにはシステム全体をエミュレーションするシステムモードと,実行バイナリを異なるCPUアーキテクチャ上のLinuxで動作させるユーザーモードが存在する.
今回はただ単純にneon命令を含んだバイナリを実行したいだけなので後者を導入する.
ubuntuならは以下のパッケージを導入するだけでなんとかなるはず.
% sudo apt-get install qemu-user
##neon命令を含むバイナリを動かす
とりあえず,以下のベクトルの和を計算するサンプルプログラムで動作検証することにする.
neon_test.c
#include <arm_neon.h>
#include <stdio.h>
int main(int argc, char const* argv[])
{
char buf1[] = { 0,1,2,3,4,5,6,7 };
char buf2[] = { 8,9,10,11,12,13,14,15 };
char buf3[8];
uint8x8_t a;
uint8x8_t b;
uint8x8_t c;
a = vld1_u8( buf1 );
b = vld1_u8( buf2 );
c = vadd_u8( a, b );
vst1_u8( buf3, c );
for( int i = 0; i < 8; i++ )
{
printf("%d\n",buf3[i]);
}
return 0;
}
んで,以下のようにコンパイル.
% arm-linux-gnueabi-gcc-4.6 -mfpu=neon -std=c99 sample.c -o sample
そして,実行.
% qemu-arm -L /usr/arm-linux-gnueabi/ sample
8
10
12
14
16
18
20
22
なんか,ちゃんと動いてるっぽいね!!