cuda 编程

C语言扩展

函数执行空间描述符

定义函数执行位置和调用位置。
1.描述符__device__ 设备执行,且仅设备调用,不能与描述符__global__同时使用
2.描述符__global__ 设备执行,主机调用,3.2后的设备可调用 ,返回void,不能是类成员
3.描述符__host__ 主机执行,仅主机调用,不能与__global__同时使用,但可与__device__同时使用,代表……
如果合适,编译器内联所有__device__函数
限定词__noinline__ 如果可能,不内联
限定词__forceinline__ 强制内联编

变量内存描述符

定义变量在设备中的位置
设备代码中的自动变量通常在寄存器中
1.描述符__device__ 设备内存空间;与所建立的CUDA上下文存在时间相同;在每个设备上分离的变量;网格中的所有线程可访问,主机可通过运行时函数访问(cudaGetSymbolAddress() / cudaGetSymbolSize() / cudaMemcpyToSymbol() / cudaMemcpyFromSymbol())
2.描述符__constant__ 常量内存;其余同上
3.描述符__shared__ 线程块的共享内存;生存时间与块相同;每块一个;仅块中内存可访问;没有常地址
外部常量内存,启动时定义大小(执行配置中),由于地址相同,所以必须给出偏移,如下共享变量:

short array0[128];
float array1[64];
int   array2[256];

使用如下:

extern __shared__ float array[];
__device__ void func()      // __device__ or __global__ function
{
    short* array0 = (short*)array;  
    float* array1 = (float*)&array0[128];
    int*   array2 =   (int*)&array1[64];
}

注意:需要类型字节对齐
4.描述符__managed__:设备和主机可同时使用
5.描述符__restrict__: 严格指针,表示不是别名。缓解c类语言的别名问题,该问题阻碍了从重排序到子表达式消除的所有类型优化。但是会增加寄存器压力,可能导致CUDA性能下降。

内建向量类型

由基本类型而来

内建变量

定义块和网格维度及序号。

内存围栏函数

弱序内存模型:CUDA线程写数据到共享内存,全局内存,锁页主机内存,对等设备内存的顺序,不一定是观察到的主机或其他CUDA写数据的顺序。

猜你喜欢

转载自blog.csdn.net/weareu/article/details/84932350