概述
不管是學習什麼程式設計語言,一般入門的實戰程式一般都是從Hello World開始的。這一節,我們就用Hello World程式進行Cuda實戰,程式的内容主要是讓CPU和GPU分别列印Hello World,在CPU中列印内容為
Hello World From CPU!
,在GPU中列印内容為
Hello World From GPU!
,具體實作請參考程式案例。
程式
//C語言标準庫
#include <stdio.h>
//Cuda運作庫
#include <cuda_runtime.h>
//核函數,GPU中運作:在GPU中列印Hello World
__global__ void mykernel(void) {
//GPU列印Hello World
printf("Hello World From GPU!\n");
}
//主函數,CPU中運作,修飾符__host__可以省略不寫
int main(void) {
//CPU列印Hello World
printf("Hello World From CPU!\n");
//調用核函數,啟用GPU執行列印任務
mykernel << <2, 2 >> > ();
//同步函數,作用為:強制CPU等待GPU執行完才執行
cudaDeviceSynchronize();
return 0;
}
補充
mykernel << <2, 2 >> > ();
原型為
mykernel << <block, thread>> > ()
,第一個參數為格中塊結構,第二個參數為塊中線結構。在這裡代表啟動了一個網格,網格裡面有2個線程塊,每個線程塊有2個線程,整個網格有4個線程,是以結果應該列印出4個Hello World。
cudaDeviceSynchronize();
一般情況下CPU調用核函數kernel後,就不會管GPU是否執行完畢,立即執行下一條語句。當調用這個同步語句後,它會阻塞CPU執行,直到GPU執行完畢後才會執行下一條語句。如果把這一條語句注釋掉,那麼控制台輸出裡面就看不到GPU部分列印的Hello World了。
輸出
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5CZjFmMjJGO5UGZjRmM2gDN2MWO0QGOlVjZmJWOxQGN38CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)