1

我正在尝试switch ... case使用 OpenMP 指令并行化(c++),但尽管我尽了最大努力,但代码比正常的顺序执行要慢。

我用过#pragma parallel,,#pragma sections我试图用 if ... else 语句重写 switch case,但没有好的结果...

switch (number) {
  case 1:
    f1();
    break;
  case 2:
    f2();
    break;
  case 3:
    f3();
    break;
  case 4:
    fn();
    break;
}

然后还有第二个问题,OpenMP 不会中断或返回。

4

1 回答 1

2

switch case 不能在 Openmp 中实现,只需添加 pragma 之类的并行部分即可。沿着并行部分运行的线程通过循环索引在它们之间划分工作,否则它们在条件循环中执行相同的工作。Openmp 部分需要知道它需要处理多少个元素或决定开始和结束的主要条件。你想让输入部分并行而不是函数(f1,f2,.. fn),所以我猜你正在处理很多“数字”。一种方法是在数组/向量中收集这些数字。然后,你可以沿着这个向量/数组做一个并行,调用相应的函数。

while(some_condition_on_numbers)
{
    // Collect Numbers in a vector / some array    
}

#pragma omp parallel for
for(int counter = 0; counter < elements_to_process; counter++)
{
    F(array_of_number[counter]);
}

F(int choice)
{
    if(choice = 1) {f1(); }
    if(choice = 2) {f2(); }
    ..
}
于 2013-04-07T09:13:21.067 回答