C
QEMU
neon

qemuでneonをつかってみる

More than 5 years have passed since last update.

開発環境を整備

とりあえず,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

なんか,ちゃんと動いてるっぽいね!!