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倍の値が出ました。素晴らしい! まぁ、実際に使うときは色々と複雑な条件が絡んでくるので、こう簡単にパフォーマンスを得られるわけじゃないと思いますが(笑)。自分も研究中です。