■
__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ラインでほぼ時間すべてなんでしょ?