【问题标题】:Measuring accurate GPU computation time测量准确的 GPU 计算时间
【发布时间】:2017-01-25 03:19:49
【问题描述】:

我正在编写一个代码,其中我必须对一块数据执行向量矩阵乘法,将结果复制回 CPU,然后开始乘以另一个块。我使用 cublas 库(以下代码)执行向量到矩阵的乘法。

clock_t a,b;
a = clock();
    for(int i=0;i<n;i++)
    {
    cublasSgemv(handle,CUBLAS_OP_T,m,k,&alpha, dev_b1+((i+1)*m), m, dev_b1+(i*m),1, &beta,out,1);
    out+=(n-(i+1));
    cudaMemcpy(b3,dev_b3, sizeof(float)*(cor_size), cudaMemcpyDeviceToHost);
    }
b = clock();
cout<<"Running time is: "<<(double)(b-a)/clocks_per_sec;

我必须测量这个 for 循环的运行时间。我读了一些关于 CudaEvent 的东西,但就我而言,我想测量总循环的时间而不是内核,所以我使用了时钟函数。我想知道这是测量这段代码时间的正确方法还是有更准确的方法来做到这一点? 我知道,为了测量运行时间,我们必须多次重复运行代码并取所有运行的平均运行时间,所以另一个问题是,对于运行代码应该重复的次数是否有任何权衡?

谢谢

【问题讨论】:

    标签: time parallel-processing cuda gpu gpgpu


    【解决方案1】:

    cudaMemcpy 同步主机和设备,因此诸如clock_t 之类的CPU 定时器应该给出与CUDA 定时器产生的结果相同的结果,为clock_t 的粒度/分辨率留出必要的余量。

    就测量的准确性而言,据我所知,计算中可以忽略第一次迭代时间。随后的时序测量应根据正在运行的算法中的负载不平衡等因素产生数字,这可能决定我们是否在每次迭代中获得相同的数字。我认为这对 Sgemm 来说不是问题。

    【讨论】:

      【解决方案2】:

      您仍然可以使用 CUDA 事件来测量整个循环运行时间,方法是记录两个事件(一个在循环开始之前,一个在结束之后,即在您当前使用 clock() 的位置),在第二个事件上同步事件,然后使用cudaEventElapsedTime() 获取经过的时间。这应该有比clock()更准确的优势。

      【讨论】:

        猜你喜欢
        • 2022-01-16
        • 2011-05-16
        • 2013-07-12
        • 1970-01-01
        • 2011-08-04
        • 2011-11-04
        • 2012-07-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多