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