一个grid中包含多个block
一个block中包含多个thread
对于不同的 组织方式都有各自不同的存储空间
每个thread---私有local memery
每个block--shared memery
对于每个设备device 共有的global memery。
CUDA中三类声明
__global__ 定义一个kernel函数(数据并行处理函数)
- 入口函数,cpu上调用,GPU上执行
- 必须返回void
__device__ GPU调用,GPU 执行
__host__ host调用,host执行
kernel 函数的调用方式
kernel函数定义 __global__ void function(A,B,C) {}
调用 function<<<num of block,num of thread>>>(A,B,C);
Grid 一维或者多维度线程块
Block 一组线程(一维,二维或者三维)
一个grid里面每个block的线程数是一样的
每个block中的线程可以:
- 同步synchronize
- 访问共享存储器shared memery
- Barrier 块内所有线程等待所有线程完成了再执行下面操作
线程索引 threadIdx
块索引 blockIdx
CUDA 内存传输
GPU中分为两块内存:1,global memory,2, constant memory
cudaMalloc() 在device端分配Global memory
cudaFree() 释放存储空间
float *M;//指向的设备端的地址,而不是主机端地址
int size = w*h*sizeof(float);
cudaMalloc((void**)&M,size)
cudaFree(M)
CUDA 内存传输
cudaMemcpy()
使用范围 host to host;host to device,device to host; device to device
//cudaMemcpy(目的地址,源地址,大小,拷贝方向)
cudaMemcpy(Md,M,size,cudaMemcpyHostToDevice); //主机端 copy 设备端
cudaMemcpy(M,Md,size,cudaMemcpyDeviceToHost);//设备端 copy 主机端
CUDA 一般框架三步走
- 为gpu内存分配空间(gpu上的输入、输出)
- 启动并行kernel
- 将GPU上结果copy到cpu,并释放步骤1上的分配空间