Time 测量精确的GPU计算时间

Time 测量精确的GPU计算时间,time,parallel-processing,cuda,gpu,gpgpu,Time,Parallel Processing,Cuda,Gpu,Gpgpu,我正在编写一个代码,其中我必须对一个数据块执行向量矩阵乘法,将结果复制回CPU,然后开始对另一个数据块进行乘法。我使用cublas库(以下代码)执行向量到矩阵的乘法 时钟a、b; a=时钟(); 对于(int i=0;icudaMemcpy,主机和设备同步,因此,时钟之类的CPU计时器应该给出与CUDA计时器产生的结果相同的结果,为时钟的粒度/分辨率留出必要的余量 关于测量的准确性,据我所见,在计算中可以忽略第一次迭代的计时。后续计时测量应根据正在运行的算法中的负载不平衡等因素得出数字,这可能决

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

时钟a、b;
a=时钟();

对于(int i=0;icudaMemcpy,主机和设备同步,因此,时钟之类的CPU计时器应该给出与CUDA计时器产生的结果相同的结果,为时钟的粒度/分辨率留出必要的余量


关于测量的准确性,据我所见,在计算中可以忽略第一次迭代的计时。后续计时测量应根据正在运行的算法中的负载不平衡等因素得出数字,这可能决定我们在每次迭代时是否得到相同的数n、 我认为这在Sgemm中不是问题。

cudaMemcpy同步主机和设备,因此CPU计时器(如时钟)应给出与CUDA计时器产生的结果相同的结果,并为时钟的粒度/分辨率留出必要的余量


关于测量的准确性,据我所见,在计算中可以忽略第一次迭代的计时。后续计时测量应根据正在运行的算法中的负载不平衡等因素得出数字,这可能决定我们在每次迭代时是否得到相同的数n、 我认为这在Sgemm中不是问题。

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

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

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;