2017-02-17 54 views
0

我试图确定是否有使用稀疏矩阵格式(特别是压缩行格式)OpenMP的稀疏雅可比

我有一个工作稀疏矩阵雅可比并行雅可比方法的一种方式。我不知道我是否可以把

!$ OMP PARALLEL DO在中间

指令做循环,因为X正在书写和读取。我猜内部do循环可以拥有它,但同样的t被覆盖,所以我不知道它是否可能。我在这里忽略了什么吗?谢谢。

x(:) = 0 
do p = 1, numIterations 
    do i=1, n 
     t=b(i) 
     do j = IA(i), IA(i+1) - 1 
      if j=i 
       d=A(j) 
      else 
       t = t - A(j) * x(jA(j)) 
      end if 
     end do 
     x(i) = t/d 
    end do 
end do 
+0

雅可比可能不是最简单的并行方法 - 你考虑过其他类型的求解器吗? – Chaosit

+0

这看起来像一个bug“'如果j = i'” –

回答

2

确实,您在内部循环中依赖于t,因为它用作累加器。但是,这也意味着您可以在每个线程中拥有t的私人副本(因为Ax未被写入循环中,所以t的值仅取决于j的值,该值也是线程专用的)。

以下应该工作:

x(:) = 0 
do p = 1, numIterations 
    do i=1, n 
     t=0 
     !$OMP PARALLEL DO 
     !$OMP REDUCTION(+:t) 
     do j = IA(i), IA(i+1) - 1 
      if j=i 
       d=A(j) 
      else 
       t = A(j) * x(jA(j)) 
      end if 
     end do 
     x(i) = (b(i)-t)/d 
    end do 
end do 

注意d只能由一个线程写入,这样在变量可以betewen螺纹,上d没有循环搬运依赖性共享。

+0

我对openMP不是很有信心,但是不应该加上'!$ OMP PRIVATE(t)'来确保t上没有隐式序列化吗? – Chaosit

+1

!$ OMP REDUCTION自动执行它(请参阅https://computing.llnl.gov/tutorials/openMP/#REDUCTION),它使列表中的所有变量都是私有的(否则它没有任何意义) – simpel01

+0

感谢您的支持响应。任何机会,你可以解释减少条款。文档有点模糊。 “在还原结束时,还原变量将应用于共享变量的所有私有副本,并将最终结果写入全局共享变量。”这是否意味着要减去的值被保留,然后在循环之后从全局变量中减去所有值? –