GPGPU是众核设备,包含大量的计算单元,实现超高速的并行。
使用CUDA在nvidia显卡上面编程时,可以使用CUDA提供的Event进行程序计时。
当然,每种编程语言基本都提供了获取系统时间的函数,如C/C++/Java 程序计时功能函数
Event可以统计GPU上面某一个任务或者代码段的精确运行时间。
如下面的程序实例(CalTime.cu):
1 #include
2 #include
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]&#61;dev_a[idx]%23*dev_a[idx]*5%9;
12 idx&#43;&#61;dis;
13 }
14 }
15
16 int main(void)
17 {
18 const int thread_pre_block &#61; 64; //每个block的线程数量
19 const int block_pre_grid &#61; 8; //grid中的block数量
20 const int NUM &#61; 45056;
21
22 //申请主机内存&#xff0c;并进行初始化
23 int host_a[NUM];
24 for(int i&#61;0;i
25 host_a[i]&#61;i;
26
27 //定义cudaError&#xff0c;默认为cudaSuccess(0)
28 cudaError_t err &#61; cudaSuccess;
29
30 //申请GPU存储空间
31 int *dev_a;
32 err&#61;cudaMalloc((void **)&dev_a, sizeof(int)*NUM);
33 if(err!&#61;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 &#61; dim3(thread_pre_block);
43 dim3 blocks &#61; dim3(block_pre_grid);
44
45 //使用event计算时间
46 float time_elapsed&#61;0;
47 cudaEvent_t start,stop;
48 cudaEventCreate(&start); //创建Event
49 cudaEventCreate(&stop);
50
51 cudaEventRecord( start,0); //记录当前时间
52 mul<<
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("执行时间&#xff1a;%f(ms)\n",time_elapsed);
65 return 0 ;
66 }
编译执行代码&#xff1a;