cuda基础知识
nvidia-cuda 手冊:https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#kernels
nvidia cuda 教學(xué)視頻?https://www.nvidia.cn/object/cuda_education_cn_old.html
介紹:
CUDA編程模型是一個異構(gòu)模型,需要CPU和GPU協(xié)同工作。在CUDA中,host和device是兩個重要的概念,我們用host指代CPU及其內(nèi)存,而用device指代GPU及其內(nèi)存。
典型的CUDA程序的執(zhí)行流程如下:
1.hello world
#include <stdio.h> #include <cuda_runtime.h> ?//頭文件//核函數(shù)聲明,前面的關(guān)鍵字__global__ __global__ void kernel( void ) { }int main( void ) {//核函數(shù)的調(diào)用,注意<<<1,1>>>,第一個1,代表線程格里只有一個線程塊;第二個1,代表一個線程塊里只有一個線程。kernel<<<1,1>>>();printf( "Hello, World!\n" );return 0; }上面流程中最重要的一個過程是調(diào)用CUDA的核函數(shù)來執(zhí)行并行計算,kernel是CUDA中一個重要的概念,kernel是在device上線程中并行執(zhí)行的函數(shù),核函數(shù)用__global__符號聲明,在調(diào)用時需要用<<<grid, block>>>來指定kernel要執(zhí)行的線程數(shù)量,在CUDA中,每一個線程都要執(zhí)行核函數(shù),并且每個線程會分配一個唯一的線程號thread ID,這個ID值可以通過核函數(shù)的內(nèi)置變量threadIdx來獲得。?
要深刻理解kernel,必須要對kernel的線程層次結(jié)構(gòu)有一個清晰的認(rèn)識。首先GPU上很多并行化的輕量級線程。kernel在device上執(zhí)行時實際上是啟動很多線程,一個kernel所啟動的所有線程稱為一個網(wǎng)格(grid),同一個網(wǎng)格上的線程共享相同的全局內(nèi)存空間,grid是線程結(jié)構(gòu)的第一層次,而網(wǎng)格又可以分為很多線程塊(block),一個線程塊里面包含很多線程,這是第二個層次
nvcc hello.cu -o hello.o
./hello.o
2.查看gpu信息
#include <stdio.h> int main() {int nDevices;cudaGetDeviceCount(&nDevices);for (int i = 0; i < nDevices; i++) {cudaDeviceProp prop;cudaGetDeviceProperties(&prop, i);printf("Device Num: %d\n", i);printf("Device name: %s\n", prop.name);printf("Device SM Num: %d\n", prop.multiProcessorCount);printf("Share Mem Per Block: %.2fKB\n", prop.sharedMemPerBlock / 1024.0);printf("Max Thread Per Block: %d\n", prop.maxThreadsPerBlock);printf("Memory Clock Rate (KHz): %d\n",prop.memoryClockRate);printf("Memory Bus Width (bits): %d\n",prop.memoryBusWidth);printf("Peak Memory Bandwidth (GB/s): %.2f\n\n",2.0 * prop.memoryClockRate * (prop.memoryBusWidth / 8) / 1.0e6);}return 0; }nvcc hello.cu -o hello.o
./hello.o
參考:https://zhuanlan.zhihu.com/p/34587739
總結(jié)
- 上一篇: 安装Opencv3
- 下一篇: 利用已有的标注文字信息制作fake数据