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 }

编译执行代码:

  

相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
相关文章
|
8月前
|
缓存 调度 数据库
Python中的定时器用法:Timer定时器和schedule库
Python中的定时器用法:Timer定时器和schedule库
448 0
|
Linux 虚拟化 监控
PERF EVENT 硬件篇
简介 本文将通过以 X86 为例子介绍硬件 PMU 如何为 linux kernel perf_event 子系统提供硬件性能采集功能 理解硬件 MSR (Model Specify Register) 可以理解为CPU硬件的专用寄存器,下述的所有寄存器都是这个类型 汇编指令 rdmsr/wrm.
3941 0
|
6月前
|
测试技术 PHP
Swoole 源码分析之 Timer 定时器模块
Swoole 中的毫秒精度的定时器。底层基于 `epoll_wait` 和 `setitimer` 实现,数据结构使用最小堆,可支持添加大量定时器。
90 0
Swoole 源码分析之 Timer 定时器模块
|
7月前
|
Python
Pygame基础1-计时器timer
Pygame基础1-计时器timer
|
机器学习/深度学习
python-- 信号量 Semphore、事件 Event
python-- 信号量 Semphore、事件 Event
python-- 信号量 Semphore、事件 Event
|
8月前
|
Go
Go 定时器:Timer 和 Ticker
本文深入探讨了 Go 语言中的 Timer 和 Ticker 定时器,详细介绍了它们的创建方式、基本用法以及相关的方法等。此外,文章还概括了这两个定时器之间的主要区别,并强调了在使用过程中的注意事项。
198 2
Go 定时器:Timer 和 Ticker
|
8月前
|
C++
QT定时器的使用timer示例
QT定时器的使用timer示例
|
运维 JavaScript 前端开发
brython | timer 计时器
brython | timer 计时器
94 1
|
Linux
settime计时器和POSIX timer函数
settime计时器和POSIX timer函数
235 0
|
Java 测试技术
在多线程中自定义实现定时器(Timer)
在多线程中自定义实现定时器(Timer)