开发者社区> 旭东的博客> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

CUDA使用Event进行程序计时

简介: GPGPU是众核设备,包含大量的计算单元,实现超高速的并行。 使用CUDA在nvidia显卡上面编程时,可以使用CUDA提供的Event进行程序计时。 当然,每种编程语言基本都提供了获取系统时间的函数,如C/C++/Java 程序计时功能函数 Event可以统计GPU上面某一个任务或者代码段的精确运行时间。
+关注继续查看

GPGPU是众核设备,包含大量的计算单元,实现超高速的并行。

使用CUDA在nvidia显卡上面编程时,可以使用CUDA提供的Event进行程序计时。

当然,每种编程语言基本都提供了获取系统时间的函数,如C/C++/Java 程序计时功能函数

Event可以统计GPU上面某一个任务或者代码段的精确运行时间。

如下面的程序实例(CalTime.cu):

 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 }

编译执行代码:

  

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
编写Java程序,使用JTable表格组件展现人员信息列表
编写Java程序,使用JTable表格组件展现人员信息列表
25 0
一段使用Java程序和JCO(Java connector)连接SAP ABAP Netweaver系统的代码
一段使用Java程序和JCO(Java connector)连接SAP ABAP Netweaver系统的代码
22 0
Java程序员如何快速理解Kubernetes
我们希望微服务是可复制的,可替换的工作节点,这样可以轻松进行升级或降级,同时无需任何停机时间,并花费最少代价的管理。我们可以说我们希望他们成为我们的小黄人(minions)。本文我们将通过一个简单的例子来了解Kubernetes可以通过创建和编排一群“小黄人"来为我们做些什么。
1546 0
《Java 7程序设计入门经典》一3.13 使用break语句退出循环
本节书摘来自华章出版社《Java 7程序设计入门经典》一书中的第3章,第3.13节,作者 (美)Herbert Schildt Dale Skrien,更多章节内容可以访问云栖社区“华章计算机”公众号查看
1036 0
+关注
旭东的博客
从事互联网开发工作,写博客,记录问题与学习支持,并分析
194
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载