C++ 带嵌套循环的OpenMP

C++ 带嵌套循环的OpenMP,c++,openmp,C++,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

我有几个函数应该连续应用于某些结构的矩阵。对于单线程,我使用以下代码:

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);
}
for(int t=0;t
现在,我正在尝试将该代码并行化:

#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并行
{
对于(int t=0;t
对吗? 它是否以重用线程的方式工作(不在主循环中创建新的线程团队)

更新:明确的障碍确实是不必要的

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

马克的评论。我假设我将在并行化函数中处理数据竞争。这里唯一的问题是:stl容器在使用OpenMP时不仅仅是线程安全的?i、 例如,如果我想从几个线程将std::list中的_向后推,我仍然需要手动锁定该列表


更新2:我发现要在并行部分运行单个操作,需要使用#pragma omp single。因此,这个问题已经结束。

是的,这将创建一个并行区域,其中每个线程将在外部循环上迭代
t
,并在线程之间分割
i
循环的迭代工作


请注意,
#pragma omp for
的末尾有一个隐式屏障,因此您无需同时编写显式屏障。可以使用
nowait
子句(即
#pragma omp for nowait
)删除此隐式障碍。

是的,这将创建一个并行区域,其中每个线程将在外部循环上迭代
t
,并在线程之间分割
i
循环的迭代工作

请注意,
#pragma omp for
的末尾有一个隐式屏障,因此您无需同时编写显式屏障。可以使用
nowait
子句(即
#pragma omp for nowait
)删除此隐式障碍。

是否正确?可能地可能不会。你的功能似乎有副作用。这些副作用可能会导致数据竞争……这是正确的吗?可能地可能不会。你的功能似乎有副作用。这些副作用可能导致数据竞争。。。