cublasSetMatrix 在相似矩阵上的不同 运行 时间
Different running time for cublasSetMatrix on similar matrices
在下面的代码中,我将函数 cublasSetMatrix 用于 3 个大小为 200x200 的随机矩阵。我在代码中测量了这个函数的时间:
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的时间比其他两个矩阵要多,尽管所有矩阵的大小都相同并且它们都是随机数。
谁能帮我看看这个结果是什么原因造成的?
通常,任何 CUDA 程序中的第一个 CUDA API 调用都会产生一些启动开销 - CUDA 运行时需要时间来初始化所有内容。
每当使用 CUDA 库时,都会有一些与库初始化相关的额外一次性启动开销。通常会观察到这种开销会影响第一次库调用的时间。
这似乎就是这里发生的事情。通过将 another cuBLAS API 调用放在您正在测量的第一个调用之前,您已将启动开销成本移至上一个调用,因此您不会对其进行测量在 cublasSetMatrix()
通话中。
在下面的代码中,我将函数 cublasSetMatrix 用于 3 个大小为 200x200 的随机矩阵。我在代码中测量了这个函数的时间:
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的时间比其他两个矩阵要多,尽管所有矩阵的大小都相同并且它们都是随机数。
谁能帮我看看这个结果是什么原因造成的?
通常,任何 CUDA 程序中的第一个 CUDA API 调用都会产生一些启动开销 - CUDA 运行时需要时间来初始化所有内容。
每当使用 CUDA 库时,都会有一些与库初始化相关的额外一次性启动开销。通常会观察到这种开销会影响第一次库调用的时间。
这似乎就是这里发生的事情。通过将 another cuBLAS API 调用放在您正在测量的第一个调用之前,您已将启动开销成本移至上一个调用,因此您不会对其进行测量在 cublasSetMatrix()
通话中。