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() 通话中。