NVIDIA CUDA统一计算设备架构编程手册(四)(未配图)

2009-6-18 作者: icuda 来源: icuda

关键字: NVIDIA CUDA GPU 手册 

  4.1     C编程语言扩展

  CUDA编程接口的目标是为熟悉C编程语言的用户提供相对简单的路径,以便容易地编写在设备上执行的程序。

  它包括:

  C语言的最小扩展集合,如4.2所述,允许程序员定位要在设备上执行的部分源码;

  运行时runtime库划分为:

  主机组件,如4.5所述,在主机上运行,提供函数以控制并访问主机中的一个或多个计算设备;

  设备组件,如4.4所述,在设备上运行,并提供特定于设备的函数;

  通用组件,如4.3所述,提供内置的向量类型,以及主机和设备代码中都支持的C标准库子集。

  必须强调一下,只有支持在设备上运行的C标准库中的函数才是公共运行时runtime组件提供的函数。

  4.2语言扩展

  C编程语言的扩展有四个部分:

  函数类型限定符,用于指定函数是在主机上还是在设备上执行,以及可以从主机中还是设备中调用(参见4.2.1);

  变量类型限定符,用于指定变量在设备上的内存位置(参见4.2.2);

  新指令,用于指定如何从主机中的设备上执行内核(参见4.2.3);

  四个内置变量,用于指定网格和块维度,以及块和线程索引(参见4.2.4)。

  包含这些扩展的每个源文件必须使用CUDA编译器nvcc编译,4.2.5中有简单介绍。nvcc的详细介绍可以参见单独的文档。

  其中每个扩展附带下文各节中描述的一些限制。违反这些限制时,nvcc将给出错误或警告,但其中一些违规无法发现。

  4.2.1函数类型限定符

  4.2.1.1   __device__

  __device__限定符声明函数:

  在设备上执行,

  只能从设备中调用。

  4.2.1.2  __global__

  __global__限定符将函数声明为内核。这种函数:

  在设备上执行,

  只能从主机中调用。

  4.2.1.3   __host__

  __host__限定符声明函数:

  在主机上执行,

  只能从主机中调用。

  它等同于仅使用__host__声明函数,或不使用__host__、__device__或__global__限定符任意一个声明函数;不管是哪一种情况,函数仅为主机编译。

  但是,__host__限定符还可以与__device__限定符结合使用,此时,函数同时为主机和设备编译。

  4.2.1.4 限制

  __device__和__global__函数不支持迭代。

  __device__和__global__函数不能在函数体内声明静态变量。

  __device__和__global__函数不能具有可变个参数。

  __device__函数不能取其地址;相反,__global__函数的函数指针则受支持。

  __global__和__host__限定符不能一起使用。

  __global__函数必须具有void返回类型。

  对__global__函数的任何调用必须指定其执行配置,如4.2.3所述。

  对__global__函数的调用是异步的,这意味着在设备完成其执行之前返回。

  __global__函数参数当前通过共享内存传递给设备并限制为256字节。

  4.2.2    变量类型限定符

  4.2.2.1   __device__

  __device__限定符声明驻留在设备上的变量。

  下面三节中定义的其他类型限定符中至多一个可以与__device__一起使用,以进一步指定变量属于哪个内存空间。如果其中任何一个都不出现,则变量:

  驻留在全局内存空间中,

  具有应用程序的生命期,

  可通过runtime库从网格中的所有线程中和从主机中访问。

  4.2.2.2   __constant__

  __constant__限定符,可以与__device__一起使用,声明变量:

  驻留在常量内存空间中,

  具有应用程序的生命期,

  可通过runtime库从网格中的所有线程中和从主机中访问。

  4.2.2.3   __shared__

  __shared__限定符,可以与__device__一起使用,声明变量:

  驻留在线程块的共享内存空间中,

  具有块的生命期,

  仅可从块内的所有线程中访问。

  线程中共享变量的完全顺序一致性,但是在线程中放松的排序。仅在__syncthreads()(参见4.4.2)执行之后,来自其他线程的写入才能保证可见。除非变量声明为挥发,否则只要满足上一语句,编译器就可以优化对共享内存的读写。

  将共享内存中的变量声明为外部数据,比如

  数组大小在启动时确定(参见4.2.3)。以此方式声明的所有变量在内存中从同一地址开始,从而数组中变量的布局必须通过偏移量明确管理。例如,如果用户想要位于动态分配的共享内存中,则用户可以使用下列方式声明和初始化数组:




<<首页 <上一页  1  2  3  4  5  6  7  下一页>  末页>>  
责任编辑:熊东旭