The parallel procedure is a convenient method to convert single loop into a multithread, concurrent processing. This conversion greatly improves application's excution time in modern multi-CPU/core computers.
In the example codes, I will introduce a parallel procedure into a multi-channel Fast Fourier Transform (FFT) application by using the MTProc unit of Free Pascal. In these examples, the 16-channel data are devided into equally-sized 2 to 16 blocks and concurrently executed by multiple for-loops.
The perfomance improvement is cleary visible in ParallelFFT02.pas, in which 512-point, 16-channel FFT are performed 3800 times, sweeping almost whole data length.
Please refer Free Pascal Wiki Page and readme.txt in the example codes for further imformation.
並列手続きは、ループを複数のスレッドに分けて実行する方法で、既存のプログラムを手軽にマルチスレッド化するのに便利です。近年のコンピュータは複数のCPUやコアを持っているのが普通なので、マルチスレッド化によって実行速度が向上することが期待されます。Free Pascal では MTProc ユニットがこの並列手続きをサポートしており、TThread クラスを陽に用いないでマルチスレッドアプリケーションを組めるよう配慮されています。
サンプルコードを展開すると、ParallelFFT01から03の三つの Pascal ファイルが得られます。その中のParallelFFT01および02に出てくる ProcThreadPool.DoParallel が、並列手続きを呼び出す手続であり、procedure DoAnIndex が並列に呼び出される手続きです。並列に呼び出される手続きは他の手続き/関数の入れ子になっていてもよく、その場合 ParallelFFT03 に出てくる ProcThreadPool.DoParallelLocalProc によって呼び出します。詳細はFree Pascal Wikiのページをご覧下さい。各ソースの最後に、出力を読み込んでグラフを描く GNU R 用のスクリプトも入れてあります。
ParallelFFT02 は、512 点の実数 FFT を 3800 回 × 16 チャネル分繰り返すプログラムです。これを用いて、ブロック数を変えてベンチマークしてみました。ブロック数を例えば 2 にすると、16 チャネルを 8 チャネルずつの 2 ブロックにわけ、それぞれにスレッドを割り当てます。CPU/コア数 が 2以上のコンピュータでは、それぞれのスレッドが独立した CPU/コア で並列実行されるので、実行速度が約 2 倍になることが期待できます。
実際に走らせてみると、予想通り、MacBook Air が積んでいる Core2Duo (1.4 GHz, 2-core) や Mac Pro (2008) が積んでいる旧式 Xeon (3.2 GHz, 4-core x 2) では、コア数 = ブロック数の時に実行速度が頭打ちになります。最近の Atom (1.8 GHz, 2-core) は 2コア+ハイパースレッディングで、4 スレッドまで同時に実行することができることもわかります。旧式とはいえ Mac Pro はやはり速く、一方 Acer の安価な 8 インチ Windows タブレットである W3-810/fp が旧式 MacBook Air 並のピーク性能を示すのは驚きです。