CUDA Fortran
NVIDIA推出的运算平台。CUDA是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。2007年以来,以NVIDIA GPU为代表的加速器并行计算开始兴起。目前流行的GPU通用编程语言是CUDA C和OpenCL,它们均是C/C++语言的扩展,因此可以方便地将C/C++代码移植到GPU上。但对于科学与工程计算中的重要编程语言Fortran,无法直接地改写为CUDA C或OpenCL。
为使Fortran应用能够使用GPU加速,The Portland Group设计了CUDA Fortran语言。气象、理论物理等领域的应用代码经过简单的改造,就能够利用GPU的强大计算能力。到目前为止,只有PGI Fortran编译器支持CUDA Fortran架构。
module mathOps
contains
attributes(global) subroutine saxpy(x, y, a)
implicit none
real :: x(:), y(:)
real, value :: a
integer :: i, n
n = size(x)
i = blockDim%x * (blockIdx%x - 1) + threadIdx%x
if (i <= n) y(i) = y(i) + a*x(i)
end subroutine saxpy
end module mathOps
program testSaxpy
use mathOps
use cudafor
implicit none
integer, parameter :: N = 40000
real :: x(N), y(N), a
real, device :: x_d(N), y_d(N)
type(dim3) :: grid, tBlock
tBlock = dim3(256,1,1)
grid = dim3(ceiling(real(N)/tBlock%x),1,1)
x = 1.0; y = 2.0; a = 2.0
x_d = x
y_d = y
call saxpy<<<grid, tBlock>>>(x_d, y_d, a)
y = y_d
write(*,*) 'Max error: ', maxval(abs(y-4.0))
end program testSaxpy
如上述代码示例,testSaxpy为主机函数,调用saxpy为GPU侧的函数,saxpy的函数运行将卸载到GPU上进行。real :: x(N), y(N)声明的x和y变量为主机变量,real, device :: x_d(N), y_d(N)声明的x_d和y_d为GPU侧变量。
CUDA Fortran通过直接将主机变量和GPU侧变量间进行赋值,进行数据传输。比如:x_d = x就将主机变量x数据赋值给了GPU侧变量x_d。
父主题: OpenMP/OpenACC优化