1

如果它们不相互依赖,那么并行执行多行代码的最佳方法是什么?(我正在使用 OpenMP)

伪代码:

database->connect()
openfile("stuff.txt")
ping("stackoverflow.com")
x = 2;
y = a + b;

我能想到的唯一方法是:

#pragma omp parallel for
for(i = 0; i < 5; i++)
switch (i) {
case 0: database->connect(); break;
...

我还没有尝试过,但我还记得你在break使用 OpenMP 时不应该这样做

4

1 回答 1

0

所以我假设你列为独立任务的个别事情只是例子。如果它们真的是这样的东西y=a+b,那么正如@chrisaycock 和@ejd 所说,它们对于这种并行性(例如基于线程,而不是ILP 或其他东西)来说太小了,因为开销而无法真正利用并发性。但如果它们是更大的操作,在 OpenMP 中执行基于任务的并行性的方法是使用task指令:例如,

#include <stdio.h>
#include <omp.h>
#include <unistd.h>

void work(int *v) {
    *v = omp_get_thread_num();
    sleep(1);
}

int main(int argc, char **argv)
{
    int a, b, c;
    #pragma omp parallel
    {
        #pragma omp single
        {
            #pragma omp task shared(a) default(none)
            work(&a);

            #pragma omp task shared(b) default(none)
            work(&b);

            #pragma omp task shared(c) default(none)
            work(&c);
        }
    }
    printf("a,b,c = %d,%d,%d\n", a, b, c);

    return 0;
}
于 2011-04-27T17:02:31.393 回答