Openmp:嵌套循环和分配

我想在另一个for循环中并行化一个for循环。 我可以直接在内部循环中使用“#pragma omp parallel for”指令,但是我担心每次创建一组新线程并不是最佳选择。 在外部循环(在内部循环之前)有分配和一些其他指令由单个线程完成(我分配一个矩阵在内部循环中共享,所以每个线程都应该有权访问它)。 我试图做这样的事情:

     #pragma omp parallel
         {
        for (auto t=1;t<=time_step;++t){
        #pragma omp single {
        Matrix<unsigned int> newField(rows,cols);
        //some instructions
         }
        unsigned int j;
        #pragma omp  for
        for (unsigned int i = 2;i<=rows-1;++i){

            for ( j = 1;j<=cols;++j){
                           //Work on NewField (i,j)
            }
        }
        #pragma omp single {
           //Instruction
          }
        }
    }

此代码不起作用。 这样(如果我让它工作)比每次创建线程更有效率? 我做错了什么?

谢谢!


OpenMP的许多实现都保留了线程池,而不是在每个并行区域之前创建它们。

所以你可以随便走

for (auto t=1;t<=time_step;++t){
    Matrix<unsigned int> newField(rows,cols);
    //some instructions
    unsigned int j;
    #pragma omp parallel for
    for (unsigned int i = 2;i<=rows-1;++i){
        for ( j = 1;j<=cols;++j){
            //Work on NewField (i,j)
        }
    }
    //Instruction
}

而且由于缺少单个指令,甚至可能会更快。


你现在编写代码的方式会导致语法错误。 当您使用OpenMP指令(如单个或重要)时,大括号必须位于新行。

所以不是这个

#pragma omp single {

}

你需要这样做

#pragma omp single
{

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

上一篇: Openmp: nested loops and allocation

下一篇: Nested openmp loop