CUDA 编程学习-API

- API部分 -

几乎所有函数返回值都是 cudaError_t

设备

1
2
3
4
5
6
7
8
9
10
11
返回计算能力大于1的GPU数量 - count
cudaGetDeviceCount(int *count);

通过device设置需要调用的gpu
cudaSetDevice(int device);

获得目前线程使用的gpu索引
cudaGetDevice(int *device);

获取指定索引GPU的信息
cudaGetDeviceProperties(struct cudaDeviceProp *prop, int device);

存储

1
2
3
4
5
6
7
8
起始地址devPtr 分配线性内存 size
cudaMalloc(void **devPtr, size_t size);

起始地址devPtr 分配2D线性内存 宽width 高height
cudaMallocPitch(void **devPtr, size_t *pitch, size_t width, size_t height);

释放devPtr指向的内存区域
cudaFree(void *devPtr);

还涉及部分CPU和GPU交互的内存分配和处理函数

1
2
初始化地址为devPtr的内存区域
cudaMemset(void *devPtr, int value, size_t count);

数据

1
2
3
4
5
6
7
8
9
10
enum __device_builtin__ cudaMemcpyKind {
cudaMemcpyKindHostToHost = 0,
cudaMemcpyKindHostToDevice = 1,
cudaMemcpyKindDeviceToHost = 2,
cudaMemcpyKindDeviceToDevice = 3,
cudaMemcpyKindDefault = 4
}

//主机与设备间的数据传输函数,源地址src,目标地址dst,kind指定传输方向。
cudaMemcpy(void *dst, const void *src, size_t count, enum cudaMemcpyKind kind);

//cudaMemcpy2D() 为2D矩阵传输函数

1
2
GPU间数据传输
cudaMemcpyPeer(void *dst, int device ,const void *src, int srcDevice, size_t count);

线程

1
2
3
4
5
CPU和GPU任务均在此完成。阻塞达到同步状态
cudaThreadSynchronzie(void)

退出CUDA并清除资源
cudaThreadExit()

流管理函数

1
2
3
4
5
6
7
8
9
10
11
创建流
cudaStreamCreate(cudaStream_t *pStream)

销毁流
cudaStreamDestroy(cudaStream_t stream)

同步流
cudaStreamSynchronize(cudaStream_t stream);

流完成状态查询函数
cudaStreamQuery(cudaStream_t stream)

事件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
创建事件
cudaEventCreate(cudaEvent_t *event);

根据flag创建事件
cudaEventCreateWithFlags(cudaEvent_t *event, unsigned int flags);
Flags的类型:
#define cudaEventDefault 0x00
#define cudaEventBlockingSync 0x01
#define cudaEventDisableTiming 0x02
#define cudaEventInterprocess 0x04

销毁事件
cudaEventDestroy(cudaEvent_t event);

记录两个事件的时间差
cudaEventElapsedTime(float *ms, cudaEvent_t start, cudaEvent_t end);

控制

1
2
3
4
5
配置CUDA启动,设置 grid 和 block 维度,共享尺寸和CUDA流
cudaConfigureCall(dim3 gridDim, dim3, blockDim, size_t sharedMem,cudaStream_t stream);

启动函数,entry是kernel函数
cudaLaunch(const char *entry);