2014-02-21 103 views
-1

如何安全地在下面嵌套for-loop线程,以便在具有8个线程的核心上并行运行程序,并仍按正确的顺序输出数据。我已经使用命令的#pragma OMP尝试,但那个给了我一个错误信息:工作共享区域不可以紧密嵌套在工作共享,临界或显式的任务区域内。Openmp - 嵌套for循环

注:此代码是介绍了并行编程,所以甚少为不断优化

#pragma omp parallel private(t, i, j) shared(nx, ny, nt) 
{ 
    // main loop 

    for (int t = 0; t < nt; t++) 
    { 
     cout << "\n" << t; 
     cout.flush(); 

     // first block 

     for (int i = 0; i < nx; i++) 
     { 
      for(int j=0; j < ny ;j++) 
      { 
       if (i> 0 && i < nx - 1 && j >0 && j < ny - 1) 
       { 
        vr[i][j] = (vi[i+1][j]+vi[i-1][j]+vi[i][j-1]+vi[i][j+1])/4.; 
       } 
       else if (i == 0 && i < nx - 1 && j > 0 && j < ny - 1) 
       { 
        vr[i][j] = (vi[i+1][j]+10.+vi[i][j-1]+vi[i][j+1])/4.; 
       } 
       else if (i > 0 && i == nx - 1 && j > 0 && j < ny - 1) 
       { 
        vr[i][j] = (5.+vi[i-1][j]+vi[i][j-1]+vi[i][j+1])/4.; 
       } 
       else if (i > 0 && i < nx - 1 && j == 0 && j < ny - 1) 
       { 
        vr[i][j] = (vi[i+1][j]+vi[i-1][j]+15.45+vi[i][j+1])/4.; 
       } 
       else if (i > 0 && i < nx - 1 && j > 0 && j == ny - 1) 
       { 
        vr[i][j] = (vi[i+1][j]+vi[i-1][j]+vi[i][j-1]-6.7)/4.; 
       } 
      } 
     } 

     // second block 

     for (int i = 0; i < nx; i++) 
     { 
      for (int j = 0; j < ny; j++) 
      { 
       if (fabs(fabs(vr[i][j]) - fabs(vi[i][j])) < 1e-2) 
       { 
        fout << "\n" << t << " " << i << " " << j << " " 
         << fabs(vi[i][j]) << " " << fabs(vr[i][j]); 
       } 
      } 

      #pragma omp for schedule(static,100) 

      // third block 

      for (int i = 0; i < nx; i++) 
      { 
       for (int j = 0; j < ny; j++) 
       { 
        vi[i][j] = vi[i][j]/2. + vr[i][j]/2.; 
       } 
      } 
     } 
    } 
+3

你可以整理你的格式化位?这是不可读的。你也应该澄清你的意思是“把事情搞砸”,因为这不是一个非常技术性的问题描述。 –

+0

添加的错误消息是否让您更好地理解我的问题?至于清晰度问题,for循环计数't'的增量是最外层的循环,其他嵌套在其中。希望有帮助 – user3332240

+0

如果你整理一下你的格式,这将有所帮助。 –

回答

1

着想写你不能这样巢OMP地区。从OMP documentation (Intel)

两个OpenMP构造不正确(动态)嵌套。 OpenMP规范对OpenMP构造如何动态嵌套施加了一些限制,也就是说,在执行另一个区域期间可以合法地遇到哪些OpenMP构造。 OpenMP并行区域可以嵌套在一起,但应用了一些限制。 一般而言,如果存在由SINGLE,CRITICAL或MASTER指令创建的中间单线程区域,则只能嵌套两个平行区域。

准确地说,以下限制适用。在下文中,术语“工作共享区域”是以下任何一种结构的缩写:循环(FOR/DO),SECTIONS,SINGLE或WORKSHARE。术语“紧密嵌套的区域”是指动态嵌套在另一个区域内的区域,在它们之间没有嵌套平行区域。

  • 工作共享区域可能没有紧密嵌套在工作共享,显式任务,关键,有序或主区域内。
  • 一个BARRIER区域可能没有紧密嵌套在工作共享,显式任务,关键,有序或MASTER区域内。
  • MASTER区域可能没有紧密嵌套在工作共享或显式TASK区域内。
  • ORDERED区域可能没有紧密嵌套在CRITICAL或显式任务区域内。
  • ORDERED区域必须用ORDERED子句紧密嵌套在循环区域(或并行循环区域)内。
  • CRITICAL区域可能不会嵌套(紧密或以其他方式)在具有相同名称的CRITICAL区域内(尽管违反此限制的报告是与此不同的错误类型)。

类似的问题已经在SO上提出并回答过。

OpenMP, for loop inside section

OpenMP for loop with master region: "master region may not be closely nested inside of work-sharing or explicit task region"