0

単純な 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 を超えない理由はありますか?

前もって感謝します

4

1 に答える 1

1

ここでの問題は、このやや不自然な例では、ホスト上で大きな配列を初期化するコスト ( a=1) が、配列の内容をインクリメントするためのループのコストとほぼ同じであることです。これは、GPU で並列化されるコードの一部です。 . 並列作業の合計量は逐次作業の合計量とほぼ同じであるため、アムダールの法則は、GPU でコードの一部を並列化することによって、あらゆる種類の大幅な速度向上を達成することに対して重くのしかかっています。

初期化操作とインクリメント操作を GPU での単一の並列操作に融合することで、おそらくさらに大幅な速度向上を達成できます。

[この回答はコメントから集められ、この質問を CUDA タグの未回答リストから外すためにコミュニティ wiki エントリとして追加されました]

于 2016-01-10T13:37:40.007 に答える