ソースコードの生成

この部分はまだデバッグ中ですが、処理の流れとしては以下のようになります。

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 } \)の平均値を求め、この平均値でパラメータを修正します。