LISPでGPGPU(2) 組み込み関数の拡張


はじめに

自作LISPにGPGPU機能を追加しています。

フロート専用配列

Deep-Learningで必要とされるのはfloat型の配列です。それをもとに行列積の計算、畳み込み演算などを行います。ISLispスタンダードで規定されている配列はその要素としてあらゆる型をとります。これをそのまま使うとDeep-Learningではメモリ効率が悪いです。そこでフロート専用の配列を用意しました。

#2f((1.0 2.0)(3.0 4.0))

create-array組込み関数の拡張

ISLispスタンダードにあるcreate-arrayは次のようになっています。

(create-array dimension initial-value)

(create-array '(3 3) 2)

これに次ぎの拡張を加えました。

(create-array dimension initial-value 'float)

(create-array '(3 3) 0.1 'float)

(create-array '(3 3) 'rand 'float)

第3引数にシンボルfloatを与えるとfloat型の配列を生成します。
初期値にシンボルrandを与えると初期値を0~1の乱数とします。

ベンチマーク

GTX1650 でのベンチマークです。

$ ./eisl
Easy-ISLisp Ver1.70
> (defglobal a (create-array '(3000 3000) 'rand 'float))
A
> (gpu-mult a a)
#2f(float-element)
> (time (gpu-mult a a))
Elapsed Time(second)=0.087010
<undef>
> (time (gpu-mult a a))
Elapsed Time(second)=0.064966
<undef>
>