在下面的代码中,我使用函数cublasSetMatrix来处理大小为200x200的3个随机矩阵。我在代码中测量了这个函数的时间:
clock_t t1,t2,t3,t4;
int m =200,n = 200;
float * bold1 = new float [m*n];
float * bold2 = new float [m*n];
float * bold3 = new float [m*n];
for (int i = 0; i< m; i++)
for(int j = 0; j <n;j++)
{
bold1[i*n+j]=rand()%10;
bold2[i*n+j]=rand()%10;
bold3[i*n+j]=rand()%10;
}
float * dev_bold1, * dev_bold2,*dev_bold3;
cudaMalloc ((void**)&dev_bold1,sizeof(float)*m*n);
cudaMalloc ((void**)&dev_bold2,sizeof(float)*m*n);
cudaMalloc ((void**)&dev_bold3,sizeof(float)*m*n);
t1=clock();
cublasSetMatrix(m,n,sizeof(float),bold1,m,dev_bold1,m);
t2 = clock();
cublasSetMatrix(m,n,sizeof(float),bold2,m,dev_bold2,m);
t3 = clock();
cublasSetMatrix(m,n,sizeof(float),bold3,m,dev_bold2,m);
t4 = clock();
cout<<double(t2-t1)/CLOCKS_PER_SEC<<" - "<<double(t3-t2)/CLOCKS_PER_SEC<<" - "<<double(t4-t3)/CLOCKS_PER_SEC;
delete []bold1;
delete []bold2;
delete []bold3;
cudaFree(dev_bold1);
cudaFree(dev_bold2);
cudaFree(dev_bold3);
此代码的输出如下:
0.121849 - 0.000131 - 0.000141
实际上,每次运行代码时,在第一个矩阵上应用cublasSetMatrix的时间多于其他两个矩阵,尽管所有矩阵的大小都相同,并且用随机数填充。
有谁可以帮我找出这个结果的原因是什么?
答案 0 :(得分:2)
通常,任何CUDA程序中的第一个CUDA API调用都会产生一些启动开销--CUDA运行时需要时间来初始化所有内容。
每当使用CUDA库时,都会有一些额外的一次性启动开销与库的初始化相关联。通常会观察到这种开销会影响第一次库调用的时间。
这似乎就是这里发生的事情。通过在您测量的第一个之前放置另一个 cuBLAS API调用,您已将启动开销成本转移到之前的调用,因此您无法在{{1再打电话。