openframeworksでopenMPを使おう!

processingやopenframeworksで映像を作るうえでの最大のボトルネックは何でしょうか?とりあえず,目先のCPUから手をつけてみましょう.最近では,マルチコアが主流になってきており,僕も昨年の夏頃に4コアに切り替えました.そこでパーティクルなどの処理を複数のコアでできれば沢山表示できるんじゃね?とのモチベーションで調べてみました.openframeworksはC++です.openMPC/C++Fortranについて標準化されています.ですので,openframeworksではopenMPを利用して並列処理(?)が簡単に出来ます.

Linuxではopenframeworksを扱うためのIDEとして,codeblocksが用いられます.では,まずcodeblocksでopenMPを利用する方法です.必要なものは,libgopm1とgccの4.2以上(g++も)です.たぶん入っていると思います.これらを揃えたらcodeblocksでの設定です.並列処理させたいプロジェクトをアクティブにして,Project>Build options,ここの左の方にプロジェクト名Debug,Releaseとありますが,プロジェクト名にフォーカスを移します.次にLinker settingsタブを選択し,Link librariesのAddよりFile:にgompと入れてやります.さらに,Compiler settingsタブ>Other optionsタブに -fopenmp を追加します.以上で設定は完了です.これで本当に正しいか不明ですが,一応動きます.

とりあえず一部のfor文を並列処理させてみたところ,シングルコアで処理させたときよりも4コアで処理させたときの方がFPSが落ちてしまいました.全然CPUを喰わない部分を並列化させても意味ないのですね.さらにtestApp::draw()内のfor文を並列処理させようとしたところコンパイルは出来たのですが,何故か実行すると落ちました.シングルコアでちっこいパーティクルを18k個くらい表示させてもシングルコアでFPS30は出ていますので,まあ今はこれで良いかなと.並列処理させるに最適な部分を見つけられればかなり処理速度が向上すると思いますので,暇なときに試してみたいです.
メモリも多少余裕がありますし,現状で最大のボトルネックはグラボのような気がしてきました.