我正在尝试评估一个简单的 cuda fortran 代码的加速:数组的增量。
处理器版本:
module simpleOps_m
contains
subroutine increment (a, b)
implicit none
integer , intent ( inout ) :: a(:)
integer , intent (in) :: b
integer :: i, n
n = size (a)
do i = 1, n
a(i) = a(i)+b
enddo
end subroutine increment
end module simpleOps_m
program incrementTest
use simpleOps_m
implicit none
integer , parameter :: n = 1024*1024*100
integer :: a(n), b
a = 1
b = 3
call increment (a, b)
if ( any(a /= 4)) then
write (* ,*) '**** Program Failed **** '
else
write (* ,*) 'Program Passed '
endif
end program incrementTest
显卡版本:
module simpleOps_m
contains
attributes ( global ) subroutine increment (a, b)
implicit none
integer , intent ( inout ) :: a(:)
integer , value :: b
integer :: i, n
n = size (a)
do i=blockDim %x*( blockIdx %x -1) + threadIdx %x ,n, BlockDim %x* GridDim %x
a(i) = a(i)+b
end do
end subroutine increment
end module simpleOps_m
program incrementTest
use cudafor
use simpleOps_m
implicit none
integer , parameter :: n = 1024*1024*100
integer :: a(n), b
integer , device :: a_d(n)
integer :: tPB = 256
a = 1
b = 3
a_d = a
call increment <<< 128,tPB >>>(a_d , b)
a = a_d
if ( any(a /= 4)) then
write (* ,*) '**** Program Failed **** '
else
write (* ,*) 'Program Passed '
endif
end program incrementTest
所以我用 pgf90 http://www.pgroup.com/resources/cudafortran.htm编译了这两个版本
使用“时间”命令来评估执行时间,我得到:
CPU版本
$ 时间(cpu 可执行文件)
实际0m0.715s
用户 0m0.410s
系统 0m0.300s
适用于 GPU 版本
$ 时间(gpu 可执行文件)
真正的 0m1.057s
用户 0m0.710s
系统 0m0.340s
所以加速=(CPU exec.time)/(GPU exec.time)是< 1 是否有一些原因为什么加速不是应该达到的> 1?
提前致谢