2012-05-02 18 views

答えて

9

強制的にランタイムAPIコンテキストを確立する正規の方法は、cudaFree(0)を呼び出すことです。複数のデバイスを使用している場合は、コンテキストを確立するデバイスのIDをcudaSetDevice()に、コンテキストを確立するにはcudaFree(0)を指定してください。

編集:CUDA 5.0の時点では、コンテキスト確立のヒューリスティックスが若干異なり、cudaSetDevice()自体が呼び出されてデバイス上でコンテキストを確立するように見えることに注意してください。だから明示的なcudaFree(0)コールはもはや必要ではありません(何も傷つけることはありません)。

2

ランタイムAPIを使用する:cudaDeviceSynchronizecudaDeviceGetLimit、または実際にコンテキストにアクセスするものは動作するはずです。

ドライバーAPIを使用していないことは確かです。怠惰な初期化はしませんが、ドライバー呼び出しのメリットはcuCtxCreateです。

+0

私はlibrairy openCVを使用しています。最初の呼び出しは遅いです。アプリケーションでデバイスを選択できますが、アプリケーションの起動時にCudaのコンテキストを初期化したいと思います。私はcudaDeviceSynchronizeを試みますが、うまくいきません – Arkerone

+0

その場合、実際にコンテキストを作成してもよろしいですか?それはほとんどのハードウェアでかなり速いです。 OpenCVは(ここで推測すると)大きなmemcpyを実行している可能性があり、事前初期化されたコンテキストはそこでは役に立ちません。 – ChrisV

+1

opencv FAQ: "これは初期化オーバーヘッドのためです。最初のGPU関数呼び出しでは、Cuda Runtime APIが暗黙的に初期化されます。また、ビデオカードの最初の使用時にGPUコードがコンパイルされます。 アプリケーションでGPUコードを1回実行することが重要な場合は、複数の実行にわたって永続的なコンパイルキャッシュを使用することができます。nvcc詳細についてはドキュメント(CUDA_DEVCODE_CACHE環境変数)を参照してください。 – Arkerone

関連する問題