CUDA使用Event进行程序计时

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 }

编译执行代码:

  

时间: 2024-10-23 03:03:36

CUDA使用Event进行程序计时的相关文章

CUDA中如何使用Event进行程序计时

GPGPU是众核设备,包含大量的计算单元,实现超高速的并行. 使用CUDA在nvidia显卡上面编程时,可以使用CUDA提供的Event进行程序计时. 当然,每种编程语言基本都提供了获取系统时间的函数,如C/C++/Java 程序计时功能函数 Event可以统计GPU上面某一个任务或者代码段的精确运行时间. 如下面的程序实例(CalTime.cu): #include<stdio.h> #include<cuda_runtime.h> //__global__声明的函数,告诉编译器

总结UNIX/LINUX下C++程序计时的方法_C 语言

前言 良好的计时器可帮助程序开发人员确定程序的性能瓶颈,或对不同算法进行性能比较.但要精确测量程序的运行时间并不容易,因为进程切换.中断.共享的多用户.网络流量.高速缓存访问及转移预测等因素都会对程序计时产生影响. 下面看看小编为大家整理几个计时方法 方法一: 如果是想统计某个程序的运行时间,那么可以使用 time ./a.out 方法二: 如果是想对某个函数或者语句进行计时,那么有别的方法.比如说,gettimeofday函数.直接贴示例代码: #include <sys/time.h> v

C/C++/Java 程序计时功能函数

编写程序肯定要使用计时功能,来判断程序的执行时间.今天Google了一下,自己就梳理总结一下: (1)C/C++程序计时 C/C++中使用的计时函数是clock(). C语言中的头文件对应是#include<time.h>,C++中对应的头文件为#include<ctime>. 如下程序实例,其中clock_t为long类型,CLOCKS_PER_SEC为每秒的时钟周期常数: 1 #include<iostream> 2 #include <ctime> 3

用PEAR::Benchmarking之Timer实现PHP程序计时

//创建一个对象 $timer = new Benchmark_Timer(); //计时开始 $timer->start(); //测试的一段脚本 for ($i=0; $i<1000; $i++) { //we do nothing here } //设置标记 $timer->setMarker("Mark1"); //输出两点之间的用时 echo $timer->timeElapsed("Start", "Mark1"

《CUDA高性能并行计算》----第1章 起 步 1.1 运行CUDA样例程序

本 节 书 摘 来 自 华 章 出 版 社 <CUDA高性能并行计算> 一 书 中 的 第1章,第1.1节, 作 者 CUDA for Engineers: An Introduction to High-Performance Parallel Computing[美] 杜安·斯托尔蒂(Duane Storti)梅特·尤尔托卢(Mete Yurtoglu) 著, 苏统华 项文成 李松泽 姚宇鹏 孙博文 译 , 更 多 章 节 内 容 可 以 访 问 云 栖 社 区 "华 章 计 算

使用GProf来优化你的C/C++程序

GProf使用了一种异常简单但是非常有效的方法来优化C++/C++程序,而且能很容易的识别出值得优化的代码.一个简单的案例分析将会显示,GProf如何通过识别并优化两个关键的数据结构,将实际应用中的程序从3分钟的运行时优化到5秒的. 这个程序最早可以追溯到1982年关于编译器构建的特别讨论大会(the SIGPLAN Symposium on Compiler Construction).现在这个程序成了各种UNIX平台上的一个标准工具. Profiling in a nutshell 程序概要

Python 程序员必知必会的开发者工具

Python已经演化出了一个广泛的生态系统,该生态系统能够让Python程序员的生活变得更加简单,减少他们重复造轮的工作.同样的理念也适用于工具开发者的工作,即便他们开发出的工具并没有出现在最终的程序中.本文将介绍Python程序员必知必会的开发者工具. 对于开发者来说,最实用的帮助莫过于帮助他们编写代码文档了.pydoc模块可以根据源代码中的docstrings为任何可导入模块生成格式良好的文档.Python包含了两个测试框架来自动测试代码以及验证代码的正确性:1)doctest模块,该模块可

NVIDIA:CUDA通过GPU加速提升高性能计算

CUDA(Compute Unified Device Architecture),显卡厂商NVidia推出的运算平台.随着显卡的发展,GPU越来越强大,而且GPU为显示图像做了优化.在计算上已经超越了通用的CPU.如此强大的芯片如果只是作为显卡就太浪费了,因此NVidia推出CUDA,让显卡可以用于图像计算以外的目的. 目前只有G80平台的NVidia显卡才能使用CUDA,工具集的核心是一个C语言编译器.G80中拥有128个单独的ALU,因此非常适合并行计算,而且数值计算的速度远远优于CPU.

JavaScript可视化图表库D3.js API中文参考_其它

D3 库所提供的所有 API 都在 d3 命名空间下.d3 库使用语义版本命名法(semantic versioning). 你可以用 d3.version 查看当前的版本信息. d3 (核心部分) 选择集 d3.select - 从当前文档中选择一系列元素. d3.selectAll - 从当前文档中选择多项元素. selection.attr - 设置或获取指定属性. selection.classed - 添加或删除选定元素的 CSS 类(CSS class). selection.sty