测量准确的 GPU 计算时间
Measuring accurate GPU computation time
我正在编写一个代码,其中我必须对一块数据执行向量矩阵乘法,将结果复制回 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 的内容,但就我而言,我想测量总循环的时间而不是内核,所以我使用了时钟函数。我想知道这是测量这段代码时间的正确方法还是有更准确的方法来做到这一点?
我知道为了测量经过的时间,我们必须多次重复 运行 代码并取所有运行经过时间的平均值,所以另一个问题是 [=] 的次数是否有任何权衡18=] 代码应该重复吗?
谢谢
cudaMemcpy 同步主机和设备,因此 CPU 定时器(例如 clock_t 应该给出与 CUDA 定时器产生的结果相同的结果,为 granularity/resolution 的 clock_t。
关于测量的准确性,据我所见,计算中可以忽略第一次迭代时间。随后的时序测量应根据算法中的负载不平衡等因素产生数字 运行,这可能决定我们是否在每次迭代中获得相同的数字。我认为这对 Sgemm 来说不是问题。
您仍然可以使用 CUDA 事件来测量整个循环运行时间,通过记录两个事件(一个在开始循环之前,一个在结束之后,即在您当前使用的位置 clock()
),同步第二个事件,然后使用 cudaEventElapsedTime()
获取经过的时间。这应该具有比 clock()
.
更准确的优点
我正在编写一个代码,其中我必须对一块数据执行向量矩阵乘法,将结果复制回 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 的内容,但就我而言,我想测量总循环的时间而不是内核,所以我使用了时钟函数。我想知道这是测量这段代码时间的正确方法还是有更准确的方法来做到这一点? 我知道为了测量经过的时间,我们必须多次重复 运行 代码并取所有运行经过时间的平均值,所以另一个问题是 [=] 的次数是否有任何权衡18=] 代码应该重复吗?
谢谢
cudaMemcpy 同步主机和设备,因此 CPU 定时器(例如 clock_t 应该给出与 CUDA 定时器产生的结果相同的结果,为 granularity/resolution 的 clock_t。
关于测量的准确性,据我所见,计算中可以忽略第一次迭代时间。随后的时序测量应根据算法中的负载不平衡等因素产生数字 运行,这可能决定我们是否在每次迭代中获得相同的数字。我认为这对 Sgemm 来说不是问题。
您仍然可以使用 CUDA 事件来测量整个循环运行时间,通过记录两个事件(一个在开始循环之前,一个在结束之后,即在您当前使用的位置 clock()
),同步第二个事件,然后使用 cudaEventElapsedTime()
获取经过的时间。这应该具有比 clock()
.