测量准确的GPU计算时间

时间:2016-09-16 19:55:13

标签: time parallel-processing cuda gpu gpgpu

我正在编写一个代码,我必须对一大块数据执行向量矩阵乘法,将结果复制回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的东西但是在我的情况下,我想测量总循环的时间而不是内核所以我使用了时钟函数。我想知道这是衡量这一块代码时间的正确方法,还是有更准确的方法可以做到这一点? 我知道,为了测量经过的时间,我们必须多次重复运行代码并获取所有运行的平均时间,所以另一个问题是,是否应该重复运行代码的次数?

由于

2 个答案:

答案 0 :(得分:1)

cudaMemcpy同步主机和设备,因此诸如clock_t之类的CPU计时器应该给出与CUDA计时器产生的结果相同的结果,从而为clock_t的粒度/分辨率提供必要的容差。

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

答案 1 :(得分:1)

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