我正在尝试确定是否有办法使用稀疏矩阵格式(特别是压缩行格式)并行化Jacobi方法
我有一个工作稀疏矩阵Jacobi。我不知道我是否可以放置
!$ 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 :(得分:2)
确实,你在内部循环中依赖于t
,因为它用作累加器。但是,这也意味着您可以在每个线程中拥有t
的私有副本(因为数组A
和x
未在循环中写入,{t
1}}仅取决于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
只能由其中一个线程写入,因此变量可以在线程之间共享,而d
上没有循环携带的依赖项。