単純な cuda fortran コードのスピードアップを評価しようとしています: 配列のインクリメント。
CPU バージョン:
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
GPU バージョン:
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で両方のバージョンをコンパイルします
「time」コマンドを使用して実行時間を評価すると、次のようになります。
CPU版の場合
$ time (CPU 実行可能ファイル)
実質 0m0.715s
ユーザー 0分0.410秒
システム 0m0.300s
GPU版の場合
$ time (gpu 実行可能ファイル)
実質 0m1.057s
ユーザー 0分0.710秒
システム 0m0.340s
したがって、スピードアップ=(CPU exec.time)/(GPU exec.time) は < 1 です。スピードアップが 1 を超えない理由はありますか?
前もって感謝します