cublasSetMatrix在类似矩阵上的运行时间不同

时间:2016-08-19 18:01:57

标签: cuda gpu gpgpu nvidia

在下面的代码中,我使用函数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的时间多于其他两个矩阵,尽管所有矩阵的大小都相同,并且用随机数填充。

有谁可以帮我找出这个结果的原因是什么?

1 个答案:

答案 0 :(得分:2)

通常,任何CUDA程序中的第一个CUDA API调用都会产生一些启动开销--CUDA运行时需要时间来初始化所有内容。

每当使用CUDA库时,都会有一些额外的一次性启动开销与库的初始化相关联。通常会观察到这种开销会影响第一次库调用的时间。

这似乎就是这里发生的事情。通过在您测量的第一个之前放置另一个 cuBLAS API调用,您已将启动开销成本转移到之前的调用,因此您无法在{{1再打电话。