cuda及常用计时方式
来源:互联网 发布:淘宝宝贝排名 编辑:程序博客网 时间:2024/05/21 23:31
CUDA中的计时方式:#include <cuda_runtime.h>
<pre code_snippet_id="1724831" snippet_file_name="blog_20160622_1_6734195" name="code" class="cpp"> cudaEvent_t start1;//stream计时
cudaEvent_t stop1;cudaEventCreate(&start1);cudaEventCreate(&stop1);cudaEventRecord(start1, NULL);Kernel<<<numblocks,numthreads>>>( a, b, c );cudaEventRecord(stop1, NULL);cudaEventSynchronize(stop1);cudaEventElapsedTime(&msecTotal, start1, stop1);需要注意的是函数cudaEventSynchronize() 不可或缺,因为CUDA的kernel函数是以异步方式执行的,调用后立刻返回,这会导致计时不准确。cudaEventSynchronize(stop1)会使得直到GPU执行完cudaEventRecord(stop1, NULL)之前的所有语句时,事件stop才会被记录下来,即起到同步的作用。
注意:此处记录的时间单位为毫秒。
clock的计时方式:#include<time.h>
clock_t start,end; start = clock();
cudaThreadSynchronize();//线程同步,gpu是异步进行的 end = clock(); printf("time=%f\n",((double)end-start)/CLOCK_PER_SEC);
另外,此处引用了nvidia论坛中横扫千军版主的原话:windows 慎用clock()
(1)clock()在windows上的精确度可能无法满足要求。(CLOCKS_PER_SEC的值是1000不假,但一般得不到
1ms的精度,一般可能会得到几个到10几个ms的精度)
(2)clock()存在严重的移植性问题。
(3)使用clock()来测时是windows "专用"的做法,在*NIX下无法这么用(和精度无关,是clock()的含义不同)。
可以使用QueryPerformanceCounter()和QueryPerformanceFrequency()来替代。
(1)clock()在windows上的精确度可能无法满足要求。(CLOCKS_PER_SEC的值是1000不假,但一般得不到
1ms的精度,一般可能会得到几个到10几个ms的精度)
(2)clock()存在严重的移植性问题。
(3)使用clock()来测时是windows "专用"的做法,在*NIX下无法这么用(和精度无关,是clock()的含义不同)。
可以使用QueryPerformanceCounter()和QueryPerformanceFrequency()来替代。
QueryPerformanceCounter()这个函数返回高精确度性能计数器的值,它可以以微妙为单位计时.但是QueryPerformanceCounter()确切的精确计时的最小单位是与系统有关的,所以,必须要查询系统以得到QueryPerformanceCounter()返回的嘀哒声的频率.QueryPerformanceFrequency()提供了这个频率值,返回每秒嘀哒声的个数.
#include<windows.h>
LARGE_INTEGER t1,t2,tc; QueryPerformanceFrequency(&tc); QueryPerformanceCounter(&t1); foo();//dosomething QueryPerformanceCounter(&t2); printf("Use Time:%f\n",(t2.QuadPart - t1.QuadPart)*1.0/tc.QuadPart);
在kernel中的clock()和clock64()还是值得使用的。
GetTickCount返回(retrieve)从操作系统启动到现在所经过(elapsed)的毫秒数,它的返回值是DWORD
<span style="font-size:14px;"> #include<windows.h></span>
<span style="font-size:14px;"> DWORD t1,t2; t1 = timeGetTime(); foo();//dosomething t2 = timeGetTime(); printf("Use Time:%f\n",(t2-t1)*1.0/1000);</span>
arrayfire中的计时方式:
timer::start();printf("elapsed seconds: %g\n", timer::stop());
<span style="font-size:18px;">Linux计时方式:</span>gettimeofday() linux环境下的计时函数,int gettimeofday ( struct timeval * tv , struct timezone * tz ),gettimeofday()会把目前的时间有tv所指的结构返回,当地时区的信息则放到tz所指的结构中.
//timeval结构定义为:struct timeval{long tv_sec; /*秒*/long tv_usec; /*微秒*/};//timezone 结构定义为:struct timezone{int tz_minuteswest; /*和Greenwich 时间差了多少分钟*/int tz_dsttime; /*日光节约时间的状态*/};void test7(){ struct timeval t1,t2; double timeuse; gettimeofday(&t1,NULL); foo(); gettimeofday(&t2,NULL); timeuse = t2.tv_sec - t1.tv_sec + (t2.tv_usec - t1.tv_usec)/1000000.0; printf("Use Time:%f\n",timeuse);}
参考:http://www.cnblogs.com/dwdxdy/p/3214905.html
0 0
- cuda及常用计时方式
- CUDA进阶第三篇:CUDA计时方式
- CUDA中的两种计时方式
- CUDA计时
- CUDA计时
- CUDA-计时
- CUDA计时
- CUDA的计时方法
- CUDA中的计时函数
- CUDA-事件计时
- cuda的计时技术
- CUDA计时差别
- CUDA 计时问题
- cuda计时⌛️
- CUDA学习笔记(4) CUDA计时函数
- CUDA:使用nvprof工具计时
- c++多态性原理及应用 & c++以及cuda 计时技术小结
- Linux精确计时,及常用C时间函数
- 判断TableView ScrollView 是向上滑动,还是向下滑动
- AndroidM如何给所有预装软件所有请求的权限
- jquery如何获取用户表单提交值
- Educational Codeforces Round 13 (ABCD ....ing)
- C++构造函数与析构函数顺序
- cuda及常用计时方式
- 各种端口的作用
- BroadcastReceiver的使用简介
- Eclipse + PyDev快捷键
- LeetCode 168. Excel Sheet Column Title
- Guava-cache
- mac 命令行配置DNS相关操作
- javascript--第12节-javascript表单处理
- Java读取txt文本内容并写入Excel