OpenMP while循环内部并行

时间:2016-03-19 16:11:17

标签: multithreading openmp

//

编辑:如何使5个线程运行代码A和第6个线程运行代码B CONCURRENTLY然后在所有线程拥有其代码后将其结果传递到单个线程?我读到我不允许使用关键字barrier OpenMP threads "disobey" omp barrier

这是我的原始代码

omp_set_num_threads(6);
#pragma omp parallel
    {
        int TID = omp_get_thread_num();

        while (true)
        {
            if (TID < 5)
            {
                // codeA

            }

            else
            {
                // codeB
            }

            // combine result from A and B
            #pragma single
            {
                //show result A and B
            }
        }
    }

我可能在google搜索足够的Can I assign multiple threads to a code section in OpenMP?

后找到了解决方案

我应该能够设置5个线程来执行任务A和1个线程来执行任务B.我只需要在退出5个线程之前使用critical来累积结果。

1 个答案:

答案 0 :(得分:0)

以下代码是否例证了您要实现的内容?在这种特殊情况下,线程0-4只是将它们的线程标识符加上一个Aresult(因为它是一个共享变量,我们需要对它进行原子访问),而线程5只是将其线程标识符分配给{ {1}}。 顺便说一句:你错过了Bresult中的omp。

请注意,我在显示A和B的结果之间添加了几个#pragma omp single,以防止线程更改Aresult / Bresult中计算的值。如果我们不添加屏障,并且未通过#pragma omp barrier的任何线程开始处理下一次迭代,则可能会发生这种情况。

请注意,添加障碍是可能的,因为OpenMP threads "disobey" omp barrier州已接受答案

  

从OpenMP V3.0 /部分2.5工作共享构造:

     

以下限制适用于工作共享结构:

     

团队中的所有线程都必须遇到每个工作共享区域   或根本没有。工作共享区域和障碍的顺序   遇到的区域对于团队中的每个线程都必须相同。

在这种情况下,每个线程在输入显示结果的代码之前和之后都会遇到屏障。

#pragma omp single
相关问题