CUDA基本知识–(不断更新)
CPU和GPU是一种异构结构。包括多个多核CPU和GPU。GPU是CPU的协处理器。GPU通过PCiE总线与机遇CPU的主机相连接来操作。
因此成为CPU是主机端,GPU是设备端。
CUDA是一种通用得并行计算平台和编程模型;
其分为内存层次架构和线程层次结构。内核与主机是异步的;
主机代码:是在CPU上面运行的,主要的工作就是设备端的环境、代码和数据。
设备代码:GPU上运行,提高并行数据的执行速度。
一些指标:
GPU容量特征:CUDA核心数量、内存大小。
GPU性能:峰值计算性能、内存宽带
CPU和GPU的优势:
CPU适合计算处理控制密集型的任务;
GPU适合处理包含数据并行的计算密集的任务;
一些修饰符 :
* global:告诉编译器这个函数将会从CPU中调用,在GPU上执行。*
<<<grid,block>>>: 启动设备上的grid个块,每个块block个线程。
__device__:仅在设备端调用
__host__:仅在主机中调用**
API函数:
cudaDeviceReset():显示释放和清空当前进程中与设备有关的资源;
cudaMalloc():
cudaMemcpy(): cudaMemcpyHostToHost 等标志位函数;致使主机阻塞
cudaMemset() cudaMemFree()
cudaGetErrorString() :将错误代码转换成为可读信息
cudaDeviceSynchronize():强制主机并行所有核函数执行
一些基本操作:
nvcc -arch sm_20 hello.cu -o hello
-arch sm_20 是编译器为Fermi架构生成设备代码
GPU内存:
全局内存和共享内存
数据在全局内存中线性存储的可以用blockIdx.x和threadIdx.x来进行操作。
GPU线程管理:
一个内核启动所产生的所有线程统称为一个网络;
所有的网络中的所有线程共享相同的全局内存空间;
同一个线程块协同合作通过:同步、共享内存 不同块内的线程不能协作;
线程依靠blockIdx和threadIdx来区分
blockDim 线程快维度,每个线程块的线程数
gridDim线程格维度,每个维度格中的线程数
核计时:
1、CPU计时 利用gettimeofday 系统调用来确定
2、nvprof 工具计时
优化需要知道的几点:
1、改变执行配置对内核性能有影响;
2、传统的核函数实现一般不能获得最佳性能;
3、对于给定的核函数,尝试不同的网格和线程块大小可以获得更好的性能;