2016-08-19 69 views
0

在下面的代码中,我使用函数cublasSetMatrix来处理大小为200x200的3个随机矩阵。我测得在代码中的该功能的时候:类似矩阵上的cublasSetMatrix的不同运行时间

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

如果您不调用同步方法,则只能测量启动函数所需的时间。操作不一定完成。第一次手术是慢得多,因为司机或者是热身或编译在运行一些CUDA内核,以正确的二进制格式。 –

+3

这很可能是cublas library启动开销的一部分。这些是你的代码中的第一个cublas调用吗?你的代码可能也有一个cublas句柄初始化。尝试将这个句柄初始化移动到cublasSetMatrix调用之前的一个点,然后查看时序是否改变。 –

+0

@RobertCrovella我用手柄初始化cublasSetMatrix之前,现在所有正在运行的时间是非常相似的。请将您的评论写为答案,以便将其标记为正确的答案。 – starrr

回答

2

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

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

这似乎是在这里发生的事情。通过您测量的第一个前放置另一 CUBLAS API调用,您已经移动启动开销到先前的电话,所以你不能测量它的cublasSetMatrix()电话了。