宣传交流:关于CUDA Fortran

大家好,作为CUDA学习者之中比较另类的一员,本人由于之前习惯了fortran,所以一直在做着CUDA fortran的编程。在这里向大家介绍下CUDA fortran并宣传下俺的QQ群 哈哈
CUDA Fortran是PGI和Nvidia合作开发的基于Fortran语法扩展得到的CUDA语言。凭我个人使用的感觉,CUDA fortran和CUDA C的执行速度是差不多的,毕竟都是Nvidia的嘛
下面主要说说语法的比较:
以向量相加为例:

首先看下CUDA C的(摘自《GPU高性能计算之CUDA》)
global void VecAdd(float* A,float* B,float* C)
{
int i=blockIdx.xblockDim.x+threadIdx.x;
if(i<N)
C[i]=A[i]+B[i];
}
int main()
{
size_t size=N
sizeof(float);
float* d_A;
cudaMalloc((void**)&d_A,size);

float* d_B;
cudaMalloc((void**)&d_B,size);

float* d_C;
cudaMalloc((void**)&d_C,size);

cudaMemcpy(d_A,h_A,size,cudaMemcpyHostToDevice);
cudaMemcpy(d_B,h_B,size,cudaMemcpyHostToDevice);

int Nt=256;
int Nb=(N+Nt-1)/Nt;
VecAdd<<<Nb,Nt>>>(d_A,d_B,d_C);

cudaMemcpy(d_C,h_C,size,cudaMemcpyDeviceToHost);

}

CUDA Fortran的代码如下(自己编写,含有一些自己的变成习惯 如module)
module Data
use cudafor
integer,allocatable::h_A,h_B,h_C
integer,device,allocatable::d_A,d_B,d_C
contains

attributes(global) subroutine VecAdd(N)
integer,value::N
integer::i

i=(blockidx%x-1)*blockdim%x+threadidx%x
if(i<N) then
d_C[i]=d_A[i]+d_B[i]
endif
endsubroutine

endmodule

program main
use Data
integer::N
integer::Nt,Nb

!!申请host数组并初始化 略

allocate(d_A(N),d_B(N),d_C(N))

d_A=h_A
d_B=h_B

Nt=256
Nb=(N+Nt-1)/Nt
call VecAdd<<<Nb,Nt>>>(N)

h_C=d_C
end

(由于我习惯了使用module 所以这个简单的例子中看起来Fortran程序有点长,但使用module对大型程序的数据管理非常有好处,相比于C的要简单很多)

从上面的代码对比可以看出 CUDAFortran的优势:
CUDA C在C的基础上增加的语法比较多 写的程序也比较复杂
CUDA Fortran最大程度上保留了原始Fortran的语法 并且在数组申请上 数据拷贝上 等等 都比CUDA C来的简单
还有一点没体现出来 就是fortran里申请数组不只是一维二维三维,我用的五维数组都能申请 只要一句allocate(A(N1,N2,N3,N4,N5))简单搞定

因此 CUDA Fortran很适合之前在搞Fortran工程编程的人使用。

同时CUDA Fortran也有一些缺点
一 版本较旧 现在 CUDA Fortran支持到 cuda3.2 CUDA C支持cuda4.0 但是版本更新是迟早的事
二 CUDAFortran相比于CUDA C做了一些简化,对工程计算的没什么影响,但对图形图像方面支持差了点

好了 大家差不多也对CUDA fortran也有所了解了
最后宣传下我的QQ群:93370504 欢迎大家一起来交流学习

[ 本帖最后由 nicolver 于 2011-6-4 00:36 编辑 ]

顶之!!!!!

请问一下,CUDA Fortran是不是暂时还不支持多GPU卡的并行运算?