小编nvh*_*h10的帖子

在 Fortran 中通过多线程转置矩阵

我正在使用 Fortran 计算一个非常大的维度矩阵的转置,P=TRANSPOSE(PP). 我看到 Fortran 中的内置函数 TRANSPOSE 非常慢。我想通过如下并行化代码来加速:

subroutine TP(nstate,P,PP)
integer i,j,nstate
double precision P(nstate,nstate),PP(nstate,nstate)
!$omp parallel shared ( P, PP,nstate) private (i, j)
!$omp do
do i=1,nstate
    do j=1,nstate
        P(j,i) = PP(i,j)
    end do
end do
!$omp end do
!$omp end parallel do
end subroutine TP(nstate,P,PP)
Run Code Online (Sandbox Code Playgroud)

不幸的是,我的代码只使用了 1 个线程并且没有任何改进。

fortran transpose matrix openmp

2
推荐指数
1
解决办法
127
查看次数

使用 OMP 加速对称矩阵的计算

我的矩阵计算是:C=CA*B

这里 C 是一个对称矩阵,所以我想通过只考虑上三角形然后取相反的 elelement 来加速这个计算。我使用了 OMP,发现我的实现比整个矩阵 C 的正常计算慢。

我还看到 C=C-AxB 的计算比 C=C+AxB 慢。

附上我的程序。请建议我!

    Program testspeed
implicit none
integer nstate,nmeas,i,j,l
integer(kind=8) :: tclock1, tclock2, clock_rate
real(kind=8) :: elapsed_time
double precision, allocatable, dimension(:,:):: B,C,A
nstate =20000
nmeas=10000
allocate (B(nmeas,nstate),C(nstate,nstate),A(nstate,nmeas))
A=1d0
B=1d0
call system_clock(tclock1)
write(*,*) "1"
!$omp parallel do
do j = 1, nstate
    do l = 1,nmeas
        do i = 1, j
            C(j,i) = C(j,i) - A(j,l)*B(l,i)
            C(i,j)=C(j,i)
        end do
    end do
end do
!$omp end parallel do
write(*,*) "2" …
Run Code Online (Sandbox Code Playgroud)

fortran transpose openmp matrix-multiplication intel-fortran

0
推荐指数
1
解决办法
77
查看次数