2016-08-19 11 views
0

次のコードでは、サイズ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つの行列より多くです。

この結果の理由は何ですか?

+0

同期メソッドを呼び出さない場合は、関数の起動にかかる時間のみを測定しています。操作は必ずしも完了していません。運転手がウォーミングアップしているか、またはいくつかのcudaカーネルをオンザフライで適切なバイナリ形式にコンパイルしているため、最初の操作ははるかに遅くなります。 –

+3

これは、おそらくcublasライブラリの起動時のオーバーヘッドの一部です。これらはコード内で最初のcublasコールですか?あなたのコードにはおそらくcublasハンドルの初期化もあります。これらのcublasSetMatrix呼び出しの前にハンドルの初期化を移動し、タイミングが変わるかどうか確認してください。 –

+0

@RobertCrovella私はcublasSetMatrixの前にハンドルの初期化を使用しました。今はすべての実行時間が非常に似ています。私は正しい答えとしてマークすることができるように答えとしてあなたのコメントを書いてください。 – starrr

答えて

2

通常、CUDAプログラムの最初のCUDA APIコールは、起動にかかるオーバーヘッドが発生します.CUDAランタイムはすべてを初期化するための時間が必要です。

CUDAライブラリが使用されるときはいつでも、ライブラリの初期化に関連する1回限りのスタートアップオーバーヘッドがあります。このオーバヘッドは、最初のライブラリー呼び出しのタイミングに影響を与えることがしばしば観察されます。

ここで起こっているようです。 cuBLAS APIコールを最初に測定する前にコールすると、起動オーバーヘッドコストが以前のコールに移動したので、もうcublasSetMatrix()コールで測定しません。

関連する問題