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

当我执行此操作时,使用加速器指令和 PGI 编译器时的执行时间为 75 毫秒。但是,当我使用“cuda fortran”实现运行相同的矩阵乘法时,执行时间仅为 5 毫秒。所以即使我使用了加速器指令,也有很大的不同。所以我怀疑我的加速器指令是否正常工作。

4

2 回答 2

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)

于 2012-03-20T16:47:59.637 回答
0

仅供参考,OP 还在 PGI 用户论坛 (http://www.pgroup.com/userforum/viewtopic.php?t=3081) 上发布了这个问题。我们认为最初的问题是飞行员错误的结果。当我们使用 CUDA Prof 分析他的代码时,CUDA Fortran 内核执行时间为 205 毫秒,而使用 PGI 加速器模型为 344 毫秒。此外,如果我修复他的代码,以便将“c(i,j)=sum”放在内部“k”循环之外,PGI 加速器模型时间会减少到 123 毫秒。目前还不清楚他是如何收集时间的。

感谢那些试图提供帮助的人。- 垫子

于 2012-03-26T22:34:36.157 回答