为什么我的fortran代码比omp并行更慢而不是没有

时间:2015-06-25 16:15:32

标签: parallel-processing fortran openmp

我用矩阵*向量乘法编码了一个以crs格式存储的矩阵。 这是我的代码:

call cpu_time(time3)
!$OMP PARALLEL DO
do o = 1, b2
    do p = row(o), row(o+1)-1
        ergcrs(o) = ergcrs(o) + val(p)*v(col(p))
    end do
end do
!$OMP END PARALLEL DO
call cpu_time(time4)

它可以使用和不使用openmp,但如果启用它,我的代码运行速度比没有openmp时慢。

2个问题:1。如果我尝试运行并行和2,为什么我的代码会变慢?我可以在并行执行循环中运行第二个do循环吗?

如果我运行这个测试程序,就会发生同样的事情:

program test

    use omp_lib

    implicit none
    integer :: i, n = 1000000000, counter = 0   
    real    :: time1, time2

    call cpu_time(time1)
    !$OMP PARALLEL DO
    do i = 1, N
        counter = counter + 1
    end do
    !$OMP END PARALLEL DO
    call cpu_time(time2)

    print *,time2-time1

end program test

是我的问题,我将结果存储在共享变量中(第一个代码段中的ergcrs(o)和第二个中的计数器)?

如果是的话,有没有办法解决它?

非常感谢你的帮助!

0 个答案:

没有答案