这是矩阵乘法的代码
program ex
implicit none
real :: a(256,256),b(256,256),c(256,256),t1,t2
integer i,j,k,sum
sum=0
do j = 1,256
do i = 1,256
a(i,j) = 1
b(i,j) = 1
c(i,j) = 0.0
enddo
enddo
call cpu_time(t1)
!$acc region do
do i=1,256
do j=1,256
sum=0
do k=1,256
sum=sum+a(i,k)*b(k,j)
c(i,j)=sum
end do
end do
end do
!$acc end region
call cpu_time(t2)
print*,"cpu time=",t2-t1
print*,c
end program ex
执行此操作时,使用加速器指令和PGI编译器时执行时间为75毫秒。但是当我使用“cuda fortran”实现运行相同的矩阵乘法时,执行时间仅为5毫秒。所以即使我使用加速器指令也有很大的不同。所以我怀疑我的加速器指令是否正常工作。
答案 0 :(得分:1)
我尝试使用非常类似的加速器指令OpenHMPP来加速您的程序。请注意,我切换了一行,这可能是在最里面的循环中错误的。还要注意,我必须向编译器提出减少建议。我还重命名了简化变量,因为它隐藏了sum
内在函数。
性能不佳,因为启动GPU内核并且因为内存传输过多。你需要更多的工作才能使用GPU。
例如,当我使用矩阵2000 x 2000时,CPU执行时间为41秒,但GPU执行时间仅为8秒。
program ex
implicit none
real :: a(256,256),b(256,256),c(256,256),t1,t2
integer i,j,k,sm
sm=0
do j = 1,256
do i = 1,256
a(i,j) = 1
b(i,j) = 1
c(i,j) = 0.0
enddo
enddo
call cpu_time(t1)
!$hmpp region, target = CUDA
!$hmppcg gridify, reduce(+:sm)
do i=1,256
do j=1,256
sm=0
do k=1,256
sm=sm+a(i,k)*b(k,j)
end do
c(i,j)=sm
end do
end do
!$hmpp endregion
call cpu_time(t2)
print*,"cpu time=",t2-t1
print*,sum(c)
end program ex
编辑:可能不会使用reduce(+:sm)
,而只能使用private(sm)
答案 1 :(得分:0)
仅供参考,OP也在PGI用户论坛上发布了这个问题(http://www.pgroup.com/userforum/viewtopic.php?t=3081)。我们认为原始问题是飞行员错误的结果。当我们使用CUDA Prof分析他的代码时,使用PGI加速器模型,CUDA Fortran内核执行时间为205 ms而344 ms。此外,如果我修复他的代码,使“c(i,j)= sum”放在内部“k”循环之外,则PGI加速器模型时间减少到123ms。目前还不清楚他是如何收集他的时间的。
感谢那些试图提供帮助的人。 - 马特