0

私は Matlab 用の CUDA プログラムを持っていますが、mex バージョンは Visual Studio バージョンよりもはるかに遅くなりますが、in/out 引数の簡単な mexFunction を除いてコードは同じです。mex バージョンは 3 秒かかり、純粋な C は 0.5 秒かかります。

Quadro K2000M カード、CUDA 機能 3.0、CUDA ドライバー 5.5、ランタイム 5.0、Visual Studio 2010 でのプログラミングを使用しています。 \"sm_30,compute_30\" (下位バージョン フラグの削除)。

詳細に、

Pure C コード (Visual Sutdio 2010 プロジェクト用に Nsight 3.1 で作成、コード生成を compute_30、sm_30 に変更)

int main(int argc, char *argv[]){
clock_t begin, end;
double elapsed_time;

// some codes that prepare parameters from argc and argv

begin = clock();
a_function_that_calls_a_cuda_kernel(parameters);
end = clock();
elapsed_time = (double)(end - begin) / CLOCKS_PER_SEC;
printf("elapsed time: %f seconds\n", elapsed_time);

return 0;
}

Matlab mex コード (MATLAB による mexGPUExample.cu に従います。詳細はhttp://www.mathworks.se/help/distcomp/create-and-run-mex-files-containing-cuda-code.htmlを参照してください。設定をわずかに変更します) -gencode=arch=compute_30,code=\"sm_30,compute_30\" に)

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
clock_t begin, end;
double elapsed_time;

// some codes that prepare parameters from prhs

begin = clock();
a_function_that_calls_a_cuda_kernel(parameters);
end = clock();
elapsed_time = (double)(end - begin) / CLOCKS_PER_SEC;
mexPrintf("elapsed time: %f seconds\n", elapsed_time);      
}

純粋な C では 0.5 秒かかるのに、mex バージョンでは 3 秒かかるのはなぜですか? ヒントをいただければ幸いです。

4

1 に答える 1

1

あなたの質問は不明です。次の比較条件を想定しています。

Visual Studio でスタンドアロン プログラムとしてコンパイルすると、 によってインターフェイスされ、mexFunctionMatlab で呼び出されるようにコンパイルされた場合よりも高速な CUDA コードがあります。

mexFunctionCUDA コンテキストがセットアップされ、カーネルがドライバーによって処理され、コードが GPU にアップロードされるため、 への最初の呼び出しは「遅い」ことに注意してください。

したがって、実行時間を有意義に見積もるには、まずカーネルを 1 回呼び出して「ウォームアップ」し、次に後続の呼び出しの実行時間を計る必要があります。コードが非常に高速な場合、タイミングは多くの呼び出しの平均時間として計算する必要があります。

于 2013-08-10T10:02:08.500 に答える