并行区域应该从哪里开始在OpenMP中?

时间:2016-10-25 23:02:12

标签: c++ openmp

我正在尝试学习OpenMP,但教授转到了另一个主题,我觉得我没有学到很多东西(或理解)。

在这里看了一些已解决的问题后,我写了这段代码:

现在,工作代码如下所示:

void many_iterations()
{
    int it, i, j;

    for (it = 0; it < NUM_ITERATIONS; it++)
    {
        #pragma omp parallel
        {
            #pragma omp for private(j)
            for (i = 0; i < N; i++)
                for (j = 0; j < M; j++)
                {
                    if (i == j) B[i][j] = A[i][j] * 2;
                    else B[i][j] = A[i][j] * 3;
                }
        }

        int **aux = A;
        A = B; B = aux;
    }


}

我还写了一个串行版本(没有#pragma omp位)并注意到这个版本实际上没有正常工作(输出A在串口和这个版本之间是不同的)。然后我设法将两个内部for循环更改为此工作位(据我所知,正确的输出):

for (index = 0; index < N * M; index++)
{
    int i = index / M, j = index % M;
    // rest of code here

这个确实有用,但我遇到了一个问题:在两个线程上运行,它和串行版本一样快(有两个内部fors),当我尝试用一​​个线程运行它时,执行时间是一个很慢。

在线阅读我明白并行部分应该以某种方式在main之前启动,以便减少开销,但同样,我的输出(A)是错误的。

所以我的问题是:

  • 如何在不破坏代码的情况下在第一个之前设置#pragma omp parallel

  • 为什么串行版本等于带有折叠for循环的代码的2线程版本?

  • 在多线程上运行时,如何使代码更有效?

作为旁注,我尝试运行带有折叠for循环的串行版本,并且让它运行得慢得多(就像带有1个线程的“并行”版本)。

编辑:尝试在循环之前使用#pragma omp parallel

void many_iterations()
{
    int it, i, j;

    #pragma omp parallel
    {
        for (it = 0; it < NUM_ITERATIONS; it++)
        {
            #pragma omp for private(j)
            for (i = 0; i < N; i++)
                for (j = 0; j < M; j++)
                   {
                       if (i == j) B[i][j] = A[i][j] * 2;
                       else B[i][j] = A[i][j] * 3;
                   }

            #pragma omp single
            {
                int **aux = A;
                A = B; B = aux;
            }
        }
    }
}

0 个答案:

没有答案