我正在使用 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 个线程并且没有任何改进。
我的矩阵计算是: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