次のコードでは、サイズ200x200の3つのランダム行列に対して関数cublasSetMatrixを使用しています。 0.000131 - - 0.000141実際類似の行列上のcublasSetMatrixの実行時間が異なります
、毎回
0.121849:
このコードの出力は次のようなもの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);
です:私は、コード内で、この関数の時間を測定し私は最初の行列のcublasSetMatrixを適用する時のコードを実行しますが、すべての行列のサイズは同じですが、乱数で満たされていますが、他の2つの行列より多くです。
この結果の理由は何ですか?
同期メソッドを呼び出さない場合は、関数の起動にかかる時間のみを測定しています。操作は必ずしも完了していません。運転手がウォーミングアップしているか、またはいくつかのcudaカーネルをオンザフライで適切なバイナリ形式にコンパイルしているため、最初の操作ははるかに遅くなります。 –
これは、おそらくcublasライブラリの起動時のオーバーヘッドの一部です。これらはコード内で最初のcublasコールですか?あなたのコードにはおそらくcublasハンドルの初期化もあります。これらのcublasSetMatrix呼び出しの前にハンドルの初期化を移動し、タイミングが変わるかどうか確認してください。 –
@RobertCrovella私はcublasSetMatrixの前にハンドルの初期化を使用しました。今はすべての実行時間が非常に似ています。私は正しい答えとしてマークすることができるように答えとしてあなたのコメントを書いてください。 – starrr