2016-09-16 2 views
0

私は、データのチャンク上でベクトル - 行列乗算を実行し、結果をCPUにコピーしてから、別のチャンクの乗算を開始する必要があるコードに取り組んでいます。私はcublasライブラリ(次のコード)を使ってベクトルから行列への乗算を行います。正確なGPUの計算時間を測定する

clock_t a,b; 
a = clock(); 
    for(int i=0;i<n;i++) 
    { 
    cublasSgemv(handle,CUBLAS_OP_T,m,k,&alpha, dev_b1+((i+1)*m), m, dev_b1+(i*m),1, &beta,out,1); 
    out+=(n-(i+1)); 
    cudaMemcpy(b3,dev_b3, sizeof(float)*(cor_size), cudaMemcpyDeviceToHost); 
    } 
b = clock(); 
cout<<"Running time is: "<<(double)(b-a)/clocks_per_sec; 

このforループの実行時間を測定する必要があります。私はCudaEventについて何かを読んだが、私のケースでは、カーネルではないトータル・ループの時間を測定したいので、私は時計機能を使用した。私はこれがコードのこの塊の時間を測定する正しい方法か、それを行うより正確な方法があるのだろうかと疑問に思っていますか? 私は、経過時間を測定するために、コードを複数回実行し、すべての実行の経過時間の平均を取る必要があることを知っています。したがって、もう1つの質問は、実行コードを繰り返す回数のトレードオフです?

おかげ

答えて

1

cudaMemcpyは、ホストとデバイスを同期させる、例えばclock_tようにCPUタイマはclock_tの粒状/解像度のために必要な手当を行う、CUDAタイマによって生成されるものと同一である結果を与えるべきです。

測定の精度に関しては、私が見てきたことから、最初の反復タイミングは計算で無視することができます。その後のタイミング測定では、実行されているアルゴリズムの負荷の不均衡などの要因に応じて数値が得られるはずです。これにより、繰り返しごとに同じ数値が得られるかどうかが決まります。私はSgemmと一緒には問題ではないと考えています。

1

CUDAイベントを使用して、2つのイベント(1つはループを開始する前、もう1つは終了後、つまり現在使用している位置にclock())を記録し、2番目のイベントその後、cudaEventElapsedTime()を使用して経過時間を取得します。これには、clock()よりも正確であるという利点があります。