【问题标题】:Open Mp nested parallelismOpenmp 嵌套并行
【发布时间】:2015-11-11 16:37:50
【问题描述】:

所以我有两个内部平行区域的外部平行区域。是否可以将 2 个线程放入外部并行,将 4 个线程放入每个内部?我做了这样的事情,但它似乎无法按照我想要的方式工作。有什么建议吗?

start_r = omp_get_wtime();
omp_set_nested(1);
omp_set_num_threads(2);
#pragma omp parallel 
{
    printf("Thread %d executes the outer parallel region\n",omp_get_thread_num());
    omp_set_num_threads(4);
    #pragma omp parellel for private(i,j,color)schedule(guided, chunk) default(shared) 
    {

// Blur
    for (int i = 1; i < x-1; i++)
        for (int j = 1; j < y-1; j++)
            for (int k = 0; k < 3; k++)
            {   
                wynik = 0;
                wynik = ((color[(i-1)][((j - 1))][k] +
                        color[(i-1)][j][k] +
                        color[(i-1)][(j + 1)][k] +
                        color[i][(j - 1)][k] +
                        color[i][j][k] +
                        color[i][(j + 1)][k] +
                        color[(i+1)][(j - 1)][k] +
                        color[(i+1)][j][k] +
                        color[(i+1)][(j + 1)][k])/9);
                if (wynik>255)wynik = 255;
                if (wynik<0)wynik = 0;
                color2[i][j][k] =  wynik;
            }
            stop_r = omp_get_wtime();
            cout << "Wyostrzenie zejelo : " << (stop_r-start_r) <<" sekund"<< endl;
            cout<<omp_get_nested( )<<endl;
            cout<<"Ilość wątków dla rozmycia : "<<omp_get_num_threads( )<<endl;
            printf("Thread %d executes the inner parallel region\n",omp_get_thread_num());
        }
        omp_set_num_threads(4);
#pragma omp parellel for schedule(guided, chunk) privat(i,j,color) default(shared)
{
// Sharp
    for (int i = 1; i < x - 1; i++)
        for (int j = 1; j < y - 1; j++)
            for (int k = 0; k < 3; k++)
            {
                wynik = 0;
                wynik = (color[(i-1)][(j - 1)][k] * (0) +
                        color[(i-1)][j][k] * (-1) +
                        color[(i-1)][(j + 1)][k] * (0) +
                        color[i][(j - 1)][k] * (-1) +
                        color[i][j][k] * 20 +
                        color[i][(j + 1)][k] * (-1) +
                        color[(i+1)][(j - 1)][k] * (0) +
                        color[(i+1)][j][k] * (-1) +
                        color[(i+1)][(j + 1)][k] * (0))/16;
                wynik = wynik % 255;
                color3[i][j][k] = wynik;



            }
            cout<<omp_get_nested( )<<endl;
            cout<<"Ilość wątków dla wyostrzenia : "<<omp_get_num_threads( )<<endl;
            printf("Thread %d executes the inner parallel region\n",omp_get_thread_num());
            }
        }
    for (int j = 0; j < y; j++)
        for (int i = 0; i < x; i++)     
            {
                fwrite(color2[i][j], 1, 3, fp2);
                fwrite(color3[i][j], 1, 3, fp3);

            }



    fclose(fp);
    fclose(fp2);
    fclose(fp3);

    system("PAUSE");
    return 0;
}
}

【问题讨论】:

  • 我建议你也用 openmp 标记这个

标签: c++ c multiprocessing openmp


【解决方案1】:

这适用于 VS2012

示例:

#include <iostream>
#include <omp.h>

int main()
{
    omp_set_nested(2);

    #pragma omp parallel num_threads( 2 )
    {
        int threadID1 = omp_get_thread_num();

        #pragma omp parallel num_threads( 4 )
        {
            int threadID2 = omp_get_thread_num();

            #pragma omp critical
            {
                std::cout << "tID1: " << threadID1 << std::endl;
                std::cout << "tID2: " << threadID2 << std::endl;
                std::cout << std::endl;
            }
        }
    }

    return EXIT_SUCCESS;
}

输出:

tID1: 0
tID2: 0

tID1: 0
tID2: 2

tID1: 0
tID2: 1

tID1: 0
tID2: 3

tID1: 1
tID2: 0

tID1: 1
tID2: 1

tID1: 1
tID2: 2

tID1: 1
tID2: 3

【讨论】:

    【解决方案2】:

    可以这样设置循环的线程数:

    #pragma parallel for num_threads(variable)
    

    另见这篇帖子openmp difference beetween num_threads vs. omp_set_num_threads vs OMP_NUM_THREADS

    【讨论】:

    • 是的,我尝试像这样将线程数放入内部区域,但它们仍然只有两个线程作为外部区域。
    • 这应该可以设置在 for(...) 上工作的线程数,而不是在一个区域上。
    • 即使我将 4 个线程放入并行循环中, omp_get_num_threads( ) - 给了我相同的答案(只有两个线程在这个循环中工作)。似乎这取决于我在外部区域之前设置了多少线程,但即使我设置了 8 个线程,它们都在内部区域工作(我不能将它们划分为同时工作)
    • 很难回答,更新你的问题,发布一个工作代码,以便我可以测试它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    相关资源
    最近更新 更多