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万要素程度だと逆に遅いので使いどころを選びそうではあるが一応使えそう。