この最初の部分は、かなり古いVisualStudio2005でOpenMPを起動して実行することです。多少の作業が必要ですが、この質問への回答に記載されています。
それが完了すると、完全に独立した2つのメソッドがある場合、この単純な形式のタスク並列処理を実行するのはかなり簡単です。修飾子に注意してください。メソッドが同じデータを読み取っている場合は問題ありませんが、他のメソッドが使用する状態を更新している場合、または他のルーチンを呼び出している場合は、問題が発生します。
メソッドが完全に独立している限り、これらのセクションを使用できます(タスクは、実際にはこれを行うためのより最新のOpenMP 3.0の方法ですが、このような古いコンパイラーのOpenMP 3.0サポートを取得できない可能性があります)。また、これを実現するために並列forループを誤用している人もいます。これには、少なくともスレッドの割り当てを制御できるという利点があるため、完全を期すためにここに含めます。
#include <omp.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int f1() {
int tid = omp_get_thread_num();
printf("Thread %d in function f1.\n", tid);
sleep(rand()%10);
return 1;
}
int f2() {
int tid = omp_get_thread_num();
printf("Thread %d in function f2.\n", tid);
sleep(rand()%10);
return 2;
}
int main (int argc, char **argv) {
int answer;
int ans1, ans2;
/* using sections */
#pragma omp parallel num_threads(2) shared(ans1, ans2, answer) default(none)
{
#pragma omp sections
{
#pragma omp section
ans1 = f1();
#pragma omp section
ans2 = f2();
}
#pragma omp single
answer = ans1+ans2;
}
printf("Answer = %d\n", answer);
/* hacky appraoch, mis-using for loop */
answer = 0;
#pragma omp parallel for schedule(static,1) num_threads(2) reduction(+:answer) default(none)
for (int i=0; i<2; i++) {
if (i==0)
answer += f1();
if (i==1)
answer += f2();
}
printf("Answer = %d\n", answer);
return 0;
}
これを実行すると
$ ./sections
Thread 0 in function f1.
Thread 1 in function f2.
Answer = 3
Thread 0 in function f1.
Thread 1 in function f2.
Answer = 3