的這第一部分是讓OpenMP的啓動和Visual Studio 2005中,這是很老運行;它需要做一些工作,但是在this question的答案中有所描述。
一旦這樣做了,這是相當容易,如果你有兩個方法:這是真正獨立的完全做任務並行的這種簡單的形式。請注意,限定符;如果方法閱讀相同的數據,這是確定的,但如果他們要更新任何狀態,其他方法使用或調用任何其他例程這樣做,那麼事情將打破。
只要方法是完全獨立的,您可以使用sections這些(tasks實際上是更現代的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
即使最新最好的Visual Studio 11仍然只支持OpenMP 2.0。看起來MS正在竭盡全力將並行處理帶入.Net平臺。 –
OOF;我不知道事情是那麼糟糕。 –
您正在寫入來自兩個不同線程(並行)的相同變量(答案)。不要這樣做。 – Simon