如果多行代码并不相互依赖,那么并行执行多行代码的最佳方法是什么? (我正在使用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;
...
我没有尝试过,但我也记得你在使用OpenMP时不应该break
答案 0 :(得分: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;
}