硬件架构:
Tesla架构:早期NVIDIA GPU的架构,主要用于高性能计算(HPC)和科学计算。代表产品:Tesla C870、Tesla C1060等。
Fermi架构:首次引入了CUDA技术。主要用于HPC、科学计算和游戏等领域。代表产品:GTX 480、GTX 580等。
Kepler架构:采用新的SMX(Streaming Multiprocessor)结构和可编程渲染管线,具有更高的性能和能效比。主要用于HPC、深度学习和计算机视觉等领域。代表产品:GTX 680、GTX Titan等。
Maxwell架构:引入了新的存储技术和节能特性,提供了更好的性能和功耗比。主要用于游戏、VR/AR等领域。代表产品:GTX 970、GTX 980等。
Pascal架构:Pascal架构是NVIDIA目前最新一代的架构,采用了16nm FinFET工艺,拥有更多的CUDA核心、更高的时钟速度和更高的功效比。主要用于深度学习、人工智能、科学计算和图形渲染等领域。代表产品:GTX 1080、Tesla P100、Titan X等。
Volta架构:是NVIDIA的最新GPU架构,是目前最强大的深度学习和人工智能计算平台。它引入了张量核技术和人工智能硬件加速器,可以为AI和HPC应用提供前所未有的性能和能效比。代表产品:Tesla V100、Titan V等。
特殊指令:
nvcc X.cu -o X
nvidia-smi
nvprof ./X
特殊结构体:
cudaDeviceProp:
cudaDeviceProp prop; int count; cudaGetDeviceCount(&count); //获取设备的个数 cudaGetDeviceProperties(&prop,i); //获得对应编号设备的属性 cudaChooseDevice&count(&count, &prop); //用于在主机上选择最优的CUDA设备,返回其的设备的ID与属性信息 cudaSetDevice(count); //选定特殊编号设备为主活动设备 |
unit3: 常用于定位线程位置
blockIdx.(x,y,z) threadIdx.(x,y,z)
dim3: 常用于指定内核函数的所用线程数量
gridDim.(x,y,z) blockDim.(x,y,z)
dim3 gridSize(x0,y0,z0); dim3 blockSize(x1,y1,z1); |
主机内存:
可分页内存:
int *a; a = (int*)malloc(nBytes); free(); |
固定内存:
int *a; cudaMallocHost((void*)&a, nBytes); cudaFreeHost(a); |
零拷贝内存:
cudaHostAlloc((void**)&h_a,nBytes,cudaHostAllocMapped); cudaHostGetDevicePointer((void**)&d_a,(void*)h_a,0); cudaFreeHost(h_a); |
统一寻址:
__device__ __managed__ int *a; cudaMallocManaged((void**)&a,N*sizeof(int)); cudaFree(a); |
设备内存:
全局内存:
cudaMalloc(); cudaMemcpy(,,cudaMemcpyHostToDevice); cudaMemcpy(,,cudaMemcpyDeviceToHost); cudaFree(); __device__ int a[100]; //任何函数的外部定义 cudaMemcpyToSymbol(); cudaMemcpyFromSymbol(); |
常量内存:全局声明
__constant__ a[1000]; //任何函数的外部定义 cudaMemcpyToSymbol() |
寄存器内存:核函数内定义
局部内存:核函数内定义
int idx; int cache[1000]; //过溢导致迁移存储 |
共享内存:内核函数内部:
__shared__ cache[100]; |
纹理内存 表面内存:全局声明
texture<float> texIn; cudaBindTexture(NULL,texIn,data.dev_inSrc,bitmap.image_size()); t=tex1Dfetch(texIn,top); cudaUnbindTexture(texIn); texture<float,2> texIn; cudaBindTexture2D(NULL,texIn,data.dev_inSrc,desc,DIM,DIM,sizeof(float)*DIM); tex2D(texIn,x,top); cudaUnbindTexture(texIn); |
设备缓存:
L1cache:SM层次
L2cache:设备层次
计时:
- seconds():
float time=seconds(); float total=time-seconds(); |
- cudaEvent_t;
cudaEvent_t start,stop; cudaEventCreate(&start); cudaEventCreate(&stop); cudaEventRecord(start,0); cudaEventRecord(stop,0); cudaEventSynchronize(stop); float time; cudaEventElapsedTime(&time,start,stop); |
- clock()
clock_t start, end; start = clock(); end = clock(); duration = (double)(end - start) / CLOCKS_PER_SEC; |
错误提示:
HANDLE_ERROR(); |
特殊前缀:
__global__
__device__
__constant__
__managed__
__shared__
__host__
杂:
GPU非缓存一致
一个线程块内最多含有1024个线程
网格MAX x轴 231-1 y轴 216-1 z轴 216-1
线程块MAX x轴 1024 y轴 1024 z轴 64
SP:流处理器,处理线程的基本单位
SM:流处理器组、流处理器簇
SPU:专用单元,处理特殊硬件指令
TPU:纹理处理单元
SFU:特殊函数单元
同步:
cudaDeviceSynchronize(); __syncthreads(); |