2012-03-20 90 views
0

。这是一个矩阵乘法加速器指令不工作

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 

代码当我执行这个执行时间是75毫秒使用加速器指示和PGI编译器时。但是当我用“cuda fortran”实现同样的矩阵乘法时,执行时间只有5毫秒。所以即使我使用加速器指令也有很大的区别。所以我怀疑我的加速器指令工作正常。

+0

而你的问题是? – talonmies 2012-03-20 14:53:16

+1

我是愚蠢的,还是OP使用加速器指令时表示执行时间从75毫秒减少到5毫秒? – 2012-03-20 15:17:08

+0

@HighPerformanceMark:CUDA fortran *可能指的是PGI的Fortran设备代码编译器,而不是PGI加速器,但谁知道? – talonmies 2012-03-20 15:23:12

回答

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)

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。目前还不清楚他如何收集他的时间。

感谢那些试图帮助。 - 垫子