OpenMP稀疏Jacobi

时间:2017-02-17 02:14:38

标签: algorithm parallel-processing fortran openmp

我正在尝试确定是否有办法使用稀疏矩阵格式(特别是压缩行格式)并行化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

1 个答案:

答案 0 :(得分:2)

确实,你在内部循环中依赖于t,因为它用作累加器。但是,这也意味着您可以在每个线程中拥有t的私有副本(因为数组Ax未在循环中写入,{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上没有循环携带的依赖项。