加速器指令不起作用

时间:2012-03-20 14:46:20

标签: fortran accelerator pgi

这是矩阵乘法的代码

 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毫秒。所以即使我使用加速器指令也有很大的不同。所以我怀疑我的加速器指令是否正常工作。

2 个答案:

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

感谢那些试图提供帮助的人。 - 马特