CUDA使用Event進行程序計時

GPGPU是衆核設備,包含大量的計算單元,實現超高速的並行。html

使用CUDA在nvidia顯卡上面編程時,可使用CUDA提供的Event進行程序計時。編程

固然,每種編程語言基本都提供了獲取系統時間的函數,如C/C++/Java 程序計時功能函數編程語言

Event能夠統計GPU上面某一個任務或者代碼段的精確運行時間。函數

以下面的程序實例(CalTime.cu):post

 1 #include<stdio.h>
 2 #include<cuda_runtime.h>
 3 
 4 //__global__聲明的函數,告訴編譯器這段代碼交由CPU調用,由GPU執行
 5 __global__ void mul(int *dev_a,const int NUM)
 6 {
 7     int idx = blockIdx.x * blockDim.x + threadIdx.x;
 8     int dis=blockDim.x * gridDim.x;
 9     while(idx<NUM)
10     {
11         dev_a[idx]=dev_a[idx]%23*dev_a[idx]*5%9;
12         idx+=dis;
13     }
14 }
15 
16 int main(void)
17 {
18     const int thread_pre_block = 64;    //每一個block的線程數量
19     const int block_pre_grid = 8;    //grid中的block數量
20     const int NUM = 45056;
21 
22     //申請主機內存,並進行初始化
23     int host_a[NUM];
24     for(int i=0;i<NUM;i++)
25         host_a[i]=i;
26 
27     //定義cudaError,默認爲cudaSuccess(0)
28     cudaError_t err = cudaSuccess;
29 
30     //申請GPU存儲空間
31     int *dev_a;
32     err=cudaMalloc((void **)&dev_a, sizeof(int)*NUM);
33     if(err!=cudaSuccess)
34     {
35         perror("the cudaMalloc on GPU is failed");
36         return 1;
37     }
38 
39     //將要計算的數據使用cudaMemcpy傳送到GPU
40     cudaMemcpy(dev_a,host_a,sizeof(host_a),cudaMemcpyHostToDevice);
41 
42     dim3 threads = dim3(thread_pre_block);
43     dim3 blocks  = dim3(block_pre_grid);
44 
45     //使用event計算時間
46     float time_elapsed=0;
47     cudaEvent_t start,stop;
48     cudaEventCreate(&start);    //建立Event
49     cudaEventCreate(&stop);
50 
51     cudaEventRecord( start,0);    //記錄當前時間
52     mul<<<blocks, threads, 0, 0>>>(dev_a,NUM);
53     cudaEventRecord( stop,0);    //記錄當前時間
54 
55     cudaEventSynchronize(start);    //Waits for an event to complete.
56     cudaEventSynchronize(stop);    //Waits for an event to complete.Record以前的任務
57     cudaEventElapsedTime(&time_elapsed,start,stop);    //計算時間差
58 
59     cudaMemcpy(&host_a,dev_a,sizeof(host_a),cudaMemcpyDeviceToHost);    //計算結果回傳到CPU
60 
61     cudaEventDestroy(start);    //destory the event
62     cudaEventDestroy(stop);
63     cudaFree(dev_a);//釋放GPU內存
64     printf("執行時間:%f(ms)\n",time_elapsed);
65     return 0 ;
66 }

編譯執行代碼:url

相關文章
相關標籤/搜索