2012-03-20 34 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。目前還不清楚他如何收集他的時間。

感謝那些試圖幫助。 - 墊子