マルチコアプログラミングクラスのプロジェクトのコーディングを終えているときに、あなたと話し合いたいと思っていた本当に奇妙なことに気づきました。
マルチコアプラットフォーム向けにプログラムすることで大幅な改善が見られるプログラムを作成するように依頼されました。OpenCLを試すために、GPUで何かをコーディングしてみることにしました。私はマトリックス畳み込み問題に精通しているので、それを選択しました(以前、open_mpiを使用して並列化し、大きな画像を大幅に高速化しました)。
これが、大きなGIFファイル(2.5 MB)[2816X2112]を選択し、シーケンシャルバージョン(元のコード)を実行すると、平均15.3秒になります。
次に、MBP統合GeForce 9400Mで作成したばかりの新しいOpenCLバージョンを実行すると、平均で1.26秒のタイミングが得られます。これまでのところ、12倍のスピードアップです。
しかし、今度は省エネパネルに移動して「グラフィックパフォーマンスモード」をオンにします。このモードでは、GeForce 9400Mがオフになり、システムに搭載されているGeforce9600MGTがオンになります。Appleによれば、このカードは統合されたカードの2倍の速度です。
何だと思いますか、キックアスグラフィックカードを使用したタイミングは平均3.2秒です…私の9600MGTは9400Mより2倍以上遅いようです。
OpenCLに傾倒している方のために、開始する前にすべてのデータをリモートバッファーにコピーするので、実際の計算ではメインRAMへのラウンドトリップは必要ありません。また、OpenCLがそのパラメーターを理解するのにかなり良い実装を行ったことを読んだので、OpenCLに最適なローカルワークサイズを決定させました。
誰か手がかりがありますか?
編集:ここにmakefilesを含む完全なソースコードhttp://www.mathieusavard.info/convolution.zip
cd gimage
make
cd ../clconvolute
make
put a large input.gif in clconvolute and run it to see results