__attribute__ ((aligned(16))) float data[1024];

int main()
{
  int i = 0;

  for (i=0; i<(1024*1024*1024)/8; i++) {
    asm volatile ("vld1.32 {d0,d1}, [%0]\n\t"
                  "vld1.32 {d2,d3}, [%0]\n\t"
                  "vld1.32 {d0,d1}, [%0]\n\t"
                  "vld1.32 {d2,d3}, [%0]\n\t"

                  "vld1.32 {d0,d1}, [%0]\n\t"
                  "vld1.32 {d2,d3}, [%0]\n\t"
                  "vld1.32 {d0,d1}, [%0]\n\t"
                  "vld1.32 {d2,d3}, [%0]\n\t"

                  "vld1.32 {d0,d1}, [%0]\n\t"
                  "vld1.32 {d2,d3}, [%0]\n\t"
                  "vld1.32 {d0,d1}, [%0]\n\t"
                  "vld1.32 {d2,d3}, [%0]\n\t"

                  "vld1.32 {d0,d1}, [%0]\n\t"
                  "vld1.32 {d2,d3}, [%0]\n\t"
                  "vld1.32 {d0,d1}, [%0]\n\t"
                  "vld1.32 {d2,d3}, [%0]\n\t"

                  :
                  :"r"(data)
                  :"d0","d1","d2","d3");
  }
}

しかたないから自分で書くか…まあマニュアルとか信用できないしね!!(2G 回ロードする)

$ time ./a.out

real    0m1.768s
user    0m1.457s
sys     0m0.013s

は?何そのreal と userの差は。


まあ、1.45秒とすると、 2/1.45 = 1.38 なので、ロードのスループットはちゃんと出る。いや1.38 / 1.805 だぞ…出てると言えるか…?


ごめんなんかtouch_fusionとかいう謎のプロセスがCPU時間10%使っていた。

$ time ./a.out

real    0m1.429s
user    0m1.422s

まあ、うーん…

あ…

$ gcc loadbench.c -mfloat-abi=hard -mfpu=neon -O2
w0@localhost:~/test/arm$ time ./a.out

real    0m1.197s
user    0m1.192s
sys     0m0.003s

$ gcc loadbench.c -mfloat-abi=hard -mfpu=neon -O0
$ time ./a.out

real    0m1.420s
user    0m1.415s
sys     0m0.004s

あのさあ…初歩的なミスとか…やる気あんの?


つまりまとめると…よくわからない?いやわかるよ。最初の3ラインでほぼ時間すべてなんでしょ?