OpenMP与嵌套循环

我有几个函数应该适用于一些结构的矩阵串行。 对于单线程,我使用下面的代码:

for(int t = 0; t < maxT; ++t)
{
    for(int i = 0; i < maxI; ++i)
        for(int j = 0; j < maxJ; ++j)
            function1(i, j);

    for(int i = 0; i < maxI; ++i)
        for(int j = 0; j < maxJ; ++j)
            function2(i, j);
}

现在我正在尝试并行化该代码:

#pragma omp parallel
{
    for(int t = 0; t < maxT; ++t)
    {
        #pragma omp single
        function3(); // call this function once (once for each iteration of t)
        #pragma omp for
        for(int i = 0; i < sizeI; ++i)
            for(int j = 0; j < sizeJ; ++j)
                function1(i, j);

        #pragma omp for
        for(int i = 0; i < sizeI; ++i)
           for(int j = 0; j < sizeJ; ++j)
               function2(i, j);
    }
}

这是对的吗? 它是否可以重用线程(不会在主循环中创建新线程团队)?

更新:显式屏障实际上是​​不必要的。

实际上,当我问这个问题时,我感到困惑 - 代码示例正常工作。 现在的问题是:是否可以在#pragma omp parrallel后面调用函数(在代码中注释行)一次(不要在每次迭代中调用每个线程中的function3)。 有#pragma omp atomic可以调用增量运算符和其他一些运算符,但是如果我想调用任意函数的单个实例(或者通常执行一段代码)?

马克的评论。 我假设我将在我的并行功能中处理数据竞赛。 这里唯一的问题是:使用OpenMP时,stl容器不是简单的线程安全的? 即,如果我想从多个线程的std :: list中push_back(),我仍然需要手动锁定该列表。

更新2:我发现要在并行部分运行单个操作,需要使用#pragma omp single。 所以,这个问题是关闭的。


是的,这将创建一个并行区域,每一个线程会遍历t在外环和分裂了的迭代的工作i的线程之间循环。

注意一个#pragma omp for在它的末尾有一个隐含的障碍,所以你不需要写出明确的障碍。 这个隐式屏障可以使用nowait子句(即#pragma omp for nowait )来删除。

链接地址: http://www.djcxy.com/p/79241.html

上一篇: OpenMP with nested loops

下一篇: openmp latency for inside for