OCamlからIntel SPMD Program Compilerを使う

せっかく最新のCPUではコア複数あるんだからOCamlからも活用したい。

ispcではGPGPUのようなイメージで独自言語のコードを専用コンパイラコンパイルしたものを普通のC/C++のコードから呼び出して使う。だったらocamlからもctypes.foreign経由で素直に使えるんじゃなかろうかということで実験。

$ ispc -O2 --arch=x86-64 --target=sse2,sse4-x2,avx sort.ispc -o objs/sort_ispc.o -h objs/sort_ispc.h
let s =
  let open Ctypes in
  foreign "sort_ispc"
  (int32_t @-> ptr uint32_t @-> ptr uint32_t @-> int32_t @-> returning void)

let sort_ispc' n code order ntasks =
  let n' = Int32.of_int n in
  let code' = C.Array.start code in
  let order' = C.Array.start order in
  let ntasks' = Int32.of_int ntasks in
  s n' code' order' ntasks'
$ time ./sort 10000000
[sort ispc]:    [110528.213] million cycles
[sort ispc + tasks]:    [73224.223] million cycles
[sort serial]:          [847924.817] million cycles
                                (7.67x speedup from ISPC, 11.58x speedup from ISPC + tasks)
./sort 10000000  579.76s user 5.71s system 112% cpu 8:41.84 total

10000000要素のソートがArray.sort比で1スレッドは7.67x、4スレッドは11.58x早い。オーバーヘッドがあるらしく1万要素程度だと逆に遅いので使いどころを選びそうではあるが一応使えそう。

https://github.com/zakki/ocaml-ispc-examples