先看下為何需要cuda來實現gpu程式設計
如圖所示,儘管現代cpu已經實現多核,但其和gpu相比還是要少得多。
所以一些重複的運算交給gpu,而一些邏輯運算交給cpu
cpu控制邏輯,gpu來輔助運算
核函式
主機(host)透過核函式來操作gpu(device)輔助計算
需要注意的是隻有核函式可以操縱gpu,包括申請記憶體、gpu中變數的計算、gpu中變數的輸出......
#include<stdio.h>
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
__global__ void hello_world(void) //像這樣修飾的就是核函式
{
printf("GPU: Hello world!\n");
}
int main(int argc, char** argv)
{
printf("CPU: Hello world!\n");
hello_world <<<1, 10 >>> ();
//核函式的呼叫時三個尖括號引用的變數為<<<grid.size,block.size>>>
cudaDeviceReset();//if no this line ,it can not output hello world from gpu
return 0;
}
輸出結果:
我們來解釋一下尖括號裡的grid.size和block.size
一個核函式只有一個grid,grid裡有block,block裡有thread
所以<<<grid.size,block.size>>>其實等價於<<<block,thread>>>
呼叫核函式時自己指定將grid分為n個block,每個block有m個thread
那麼block的編號為0-n,thread的編號為0-m
blockIdx則為block的編號,二維情況下則用blockIdx.x
threadIdx則為thread的編號,二維情況下用threadIdx.x