OpenMPを使う
QtCreatorでOpenMPを使う方法です。先ず、*.proファイルに以下を追加します。OpenMPのヘッダを使えるようになります。
QMAKE_CXXFLAGS += -fopenmp LIBS += -fopenmp
OpenMPは、pthreadGC2.dll というDLLを使うので、debugフォルダ、releaseフォルダに配置しておきます。このDLLはLGPLらしいので、自作アプリに添付しても大丈夫そうです。redhatのプロジェクトから貰ってくるのが一般的っぽいです。
ftp://sources.redhat.com/pub/pthreads-win32/dll-latest/lib/
実際にコードを書いてみましょう。
#include <omp.h> // OpenMPを使う #include <QElapsedTimer> void paraFunc() { int n = 1000; uint8_t* ptr = (uint8_t*)malloc( n*n ); int i,j; for (i=0; i<30; i++) { int a = 12345; for (j=0; j<n*n; j++) { a = a * (a+1); a = a / (a+1); } } free( ptr ); } void MainWindow::on_pushButton_clicked() { int mx = omp_get_max_threads(); // 最大スレッド数 QElapsedTimer et; et.start(); int i; #pragma omp parallel for for(i = 0; i < 32; i++) { // 並列処理 1747ms paraFunc(); } /* for(i = 0; i < 32; i++) { // 通常処理 10499ms paraFunc(); } */ qint64 t = et.elapsed(); ui->label->setText( QString::number(t) ); }
Core-i7 (8スレッド) で試してみたら、約6倍の値が出ました。素晴らしい! まぁ、実際に使うときは色々と複雑な条件が絡んでくるので、こう簡単にパフォーマンスを得られるわけじゃないと思いますが(笑)。自分も研究中です。