3

私は3つのカーネルを使用するプログラムを持っています。スピードアップを得るために、私は次のようにコンテキストを作成するためにダミーのメモリコピーを実行していました。

__global__ void warmStart(int* f)
{
    *f = 0;
}

これは、次のように時間を計りたいカーネルの前に起動されます。

int *dFlag = NULL;
cudaMalloc( (void**)&dFlag, sizeof(int) );
warmStart<<<1, 1>>>(dFlag);
Check_CUDA_Error("warmStart kernel");

cudaFree(0)また、またはとしてコンテキストを作成する他の最も簡単な方法についても読みましたcudaDevicesynchronize()。ただし、これらのAPI呼び出しを使用すると、ダミーカーネルを使用するよりも時間がかかります。

コンテキストを強制した後のプログラムの実行時間は0.000031、ダミーカーネルの場合は秒0.000064、cudaDeviceSynchronize()とcudaFree(0)の両方の場合は秒です。時間は、プログラムの10回の個別実行の平均として取得されました。

したがって、私が到達した結論は、カーネルを起動すると、標準的な方法でコンテキストを作成するときに初期化されないものが初期化されるということです。

では、カーネルを使用する方法とAPI呼び出しを使用する方法の2つの方法でコンテキストを作成することの違いは何ですか?

LinuxでCUDA4.0を使用して、GTX480でテストを実行します。

4

1 に答える 1

3

各CUDAコンテキストには、カーネルの実行に必要なメモリ割り当てがありますが、同期、メモリの割り当て、またはメモリの解放に割り当てる必要はありません。コンテキストメモリの初期割り当てとこれらの割り当てのサイズ変更は、カーネルがこれらのリソースを必要とするまで延期されます。これらの割り当ての例には、ローカルメモリバッファ、デバイスヒープ、およびprintfヒープが含まれます。

于 2012-11-09T19:26:01.873 に答える