beignet

あ、これ出力asm見れるのか。


Kernel BuilderはGPUだとasm見れないから諦めていた。

$ export OCL_OUTPUT_ASM=1
$ ./a.out
    <.. snip ..>
hello's disassemble begin:
  L0:
    (       0)  mov(16)         g2<1>:UW        0xffffUW                        { align1 WE_all 1H };
    (       2)  mov(16)         g2<1>:UW        0x0UW                           { align1 WE_normal 1H };
    (       4)  mov(1)          g1<2>:UW        0x0UW                           { align1 WE_normal };
    (       6)  mov(1)          g1.2<2>:UW      -1W                             { align1 WE_normal };
    (       8)  cmp.le(16)      null:UW         g2<8,8,1>:UW    0x0UW           { align1 WE_all 1H switch };
    (      10)  (+f0) if(16) 70                                                 { align1 WE_normal 1H };
    <.. snip ..>
    (      95)  nop                                                             ;
    (      97)  nop                                                             ;
    (      99)  nop                                                             ;

とかになる。

vs Parallella

なんか会社でParallellaを使ってみようみたいな流れになって使っていたのだが、(別に業務とは関係なく)
https://github.com/adapteva/epiphany-examples/tree/master/apps/matmul-16
を動かして、Host 1700msec、Epiphany 170msecとかになって、さすが、16coreだから10倍速いみたいな話になったが、経験的に、こういうのってナイーブCと比較してるから、普通にマルチスレッド & NEON使えば、10倍差ぐらいすぐはやくなんじゃね?と、思ってNEON + スレッド化matmulを探したのだけど、見当たらなくて、探すより書いたほうがはやそうだったので書いた。

https://github.com/tanakamura/matmul-bench

一応 Parallella ボードに付いてる Cortex A9 667MHz 2core で、 330[msec] ぐらいまで行ったので、あと倍になればEpiphanyに追い付けるはず。効率17%だからまあ根気良くチューニングすればいけると思うけど。


しかし巷のBLASの効率とか見てると、gemm効率90%以上出せない奴は人間じゃないみたいな雰囲気だったのでもうちょっとなんとかしたい。


まあ大分わかってきた。レジスタブロッキングしないといけないんでしょ?まあどうしたらいいかわからんけど。


ちなみに、https://github.com/tanakamura/matmul-bench のホスト側のコードはそんなにナイーブでもなくて、真面目にナイーブに書くと12秒ぐらいだった。


あとEpiphanyは結局全く触れてない。