ソースコードの生成
この部分はまだデバッグ中ですが、処理の流れとしては以下のようになります。
1. 代入文の依存関係を求めます。
2. 代入文の依存関係を使い代入文の実行順序を決めます。
3. ヘッダファイルのコードを作ります。
フィールドの宣言と関数の宣言を作ります。
4. コンストラクタ、デストラクタ、配列の領域の確保と解放の関数を作ります。
CUDAの場合、配列の領域はGPUのメモリ内に作り、C++の場合はCPUのメモリ内に作ります。
5. 順伝播/逆伝播の関数を作ります。
確率的勾配降下法では多数の学習データの中からランダムに10個ぐらいの学習データ(ミニバッチ)を抜き出し、ミニバッチのデータを並列で処理します。
CUDAの場合、順伝播/逆伝播の関数のカーネル関数とカーネル起動関数を作ります。
カーネル関数はGPUの中のプロセッサで実行される関数です。
カーネル起動関数はCPU側で実行されます。
代入文の中で参照されているフィールドを求め、これらは引数としてカーネル関数に渡します。
CUDAではループはthreadとthread blockの形で並列処理をします。
C++の場合は、ループはfor文の形で実行します。
6. パラメータ更新の関数を作ります。
ミニバッチのパラメータの偏微分 \( \frac{\partial E}{ \partial p_k } \)の平均値を求め、この平均値でパラメータを修正します。