Cuda 相似矩阵上cublasSetMatrix的不同运行时间

Cuda 相似矩阵上cublasSetMatrix的不同运行时间,cuda,gpu,gpgpu,nvidia,Cuda,Gpu,Gpgpu,Nvidia,在下面的代码中,我对3个大小为200x200的随机矩阵使用函数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

在下面的代码中,我对3个大小为200x200的随机矩阵使用函数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);
时钟t1、t2、t3、t4;
int m=200,n=200;
float*bold1=新的float[m*n];
float*bold2=新的float[m*n];
float*bold3=新的float[m*n];
for(int i=0;i对于(int j=0;j通常,任何CUDA程序中的第一个CUDA API调用都会产生一些启动开销-CUDA运行时需要时间来初始化所有内容

无论何时使用CUDA库,都会有一些与库初始化相关的额外一次性启动开销。经常会观察到这种开销,从而影响第一次库调用的时间


这似乎就是这里正在发生的事情。通过将另一个Cubllas API调用放在第一个正在测量的调用之前,您已经将启动开销移到了前一个调用,因此您不会在
cublasSetMatrix()上测量它
不再调用。

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

无论何时使用CUDA库,都会有一些与库初始化相关的额外一次性启动开销。经常会观察到这种开销,从而影响第一次库调用的时间


这似乎就是这里正在发生的事情。通过将另一个Cubllas API调用放在第一个正在测量的调用之前,您已经将启动开销移到了前一个调用,因此您不会在
cublasSetMatrix()上测量它
不再调用。

如果您不调用同步方法,您只是测量启动函数所需的时间。操作不一定完成。第一个操作要慢得多,因为驱动程序正在预热或将一些cuda内核编译为正确的二进制格式。这很可能是cub的一部分las库启动开销。这些是您代码中的第一个cublas调用吗?您的代码可能还有一个cublas句柄初始化。请尝试将该句柄初始化移动到这些CUBLASETMATRIX调用之前的某个点,然后查看时间是否更改。@RobertCrovella我在CUBLASETMATRIX之前使用了句柄初始化,现在每次都运行一次We’很相似。请写下您的评论作为答案,这样我就可以将其标记为正确答案。有一个很好的工具可以测量每个函数所花费的时间-NSIGHT。尝试使用它,它将为您提供更详细和正确的信息如果您不调用同步方法,您只测量启动函数所花费的时间操作不一定完成。第一个操作要慢得多,因为驱动程序正在预热某些cuda内核,或者正在将其编译为正确的二进制格式。这很可能是cublas库启动开销的一部分。这些是您代码中的第一个cublas调用吗?您的代码可能还具有cublas句柄初始化ion。尝试将句柄初始化移动到这些cublasSetMatrix调用之前的某个点,然后查看计时是否更改。@RobertCrovella我在cublasSetMatrix之前使用了句柄初始化,现在所有的运行时间都非常相似。请将您的注释作为答案,以便我可以将其标记为正确答案。有一个测量时间的好工具花在每一个函数上-NSIGHT。尝试使用它,它将为您提供更详细和正确的信息