cuda 核函式

拾墨、發表於2024-03-09


先看下為何需要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

相關文章