第一部分是让 OpenMP 与 Visual Studio 2005 一起运行,它已经很老了。这需要做一些事情,但在这个问题的答案中有描述。
一旦完成,如果您有两种真正完全独立的方法,那么执行这种简单形式的任务并行就相当容易了。注意限定符;如果这些方法正在读取相同的数据,那没关系,但是如果它们正在更新另一个方法使用的任何状态,或者调用任何其他这样做的例程,那么事情就会中断。
只要方法完全独立,您就可以使用这些部分(任务实际上是更现代的 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