我正在尝试使用OpenMP指令并行化switch ... case
(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不会中断或返回。
答案 0 :(得分:1)
开关案例不能在Openmp中实现,只需添加pragma,如parallel,section。沿着并行部分运行的线程通过循环索引在它们之间划分工作,否则它们在条件循环中执行相同的工作。 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(); }
..
}