0

我正在尝试评估一个简单的 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?

提前致谢

4

1 回答 1

1

a=1这里的问题是,在这个相当人为的示例中,在主机 ( . 由于并行工作的总量与串行工作的总量大致相同,因此阿姆达尔定律与通过在 GPU 上并行化一些代码来实现任何类型的显着加速非常不利。

通过将初始化和增量操作融合到 GPU 上的单个并行操作中,可能会实现更显着的加速。

[此答案已从评论中收集并添加为社区 wiki 条目,以将此问题从 CUDA 标签的未回答列表中删除]

于 2016-01-10T13:37:40.007 回答