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的时间比其他两个矩阵多,尽管所有矩阵的大小都是相同的,并且它们都是随机数。
任何人都可以请帮我找出这个结果是什么原因?
如果您不调用同步方法,则只能测量启动函数所需的时间。操作不一定完成。第一次手术是慢得多,因为司机或者是热身或编译在运行一些CUDA内核,以正确的二进制格式。 –
这很可能是cublas library启动开销的一部分。这些是你的代码中的第一个cublas调用吗?你的代码可能也有一个cublas句柄初始化。尝试将这个句柄初始化移动到cublasSetMatrix调用之前的一个点,然后查看时序是否改变。 –
@RobertCrovella我用手柄初始化cublasSetMatrix之前,现在所有正在运行的时间是非常相似的。请将您的评论写为答案,以便将其标记为正确的答案。 – starrr