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()来替代。
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