問題タブ [cuda-context]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
cuda - 指定されたリソースのコンテキストを確認します
たとえば、ストリーム、ホスト、デバイスのメモリ終了イベントなど、初期化されたリソースがたくさんある状況を想像してみましょう。それらの一部は1つのGPUのコンテキストで初期化され、残りは他のGPUコンテキストに属します。
特定のリソース(イベント、ストリーム、またはメモリ)が特定のGPUコンテキストに属しているかどうかを確認する方法はありますか?
場合によっては、メモリコピーまたはカーネル実行を注文してから取得する前に、そのようなことを主張する価値がありますcudaErrorInvalidArgument
。
linux - アプリケーション間で Cuda コンテキストを共有することは可能ですか?
2 つの独立した Linux プロセス間で Cuda コンテキストを渡したいと思います (既にセットアップした POSIX メッセージ キューを使用します)。
cuCtxPopCurrent()
とを使っcuCtxPushCurrent()
てコンテキストポインタを取得できますが、このポインタは関数を呼び出したプロセスのメモリ内で参照され、プロセス間で受け渡ししても意味がありません。
私は他の解決策を探しています。これまでの私のアイデアは次のとおりです。
- 構造体のディープ コピーを試みてから
CUcontext
、コピーを渡します。 - 両方のプロセスがアクセスできるように、すべての Cuda ポインターがそこに配置されている共有メモリ ソリューションを見つけることができるかどうかを確認してください。
- プロセスを 1 つのプログラムにマージします。
- Cuda 4.0 ではコンテキスト共有が改善されている可能性があり、これに切り替えることができます。
オプション (1) が可能かどうかも、(2) が使用可能か可能かどうかもわかりません。(3) を一般的なものにしたい場合、実際にはオプションではありません (これはハイジャック シム内にあります)。(4) Cuda 4.0 を見てみますが、そこで動作するかどうかもわかりません。
ありがとう!
c++ - CUDA ストリームとコンテキスト
私は現在、一連の pthreads (linux) を生成するアプリケーションを使用しており、それらのそれぞれが独自の CUDA コンテキストを作成します。(現在cuda 3.2を使用しています)。
私が抱えている問題は、独自のコンテキストを持つ各スレッドが GPU で大量のメモリを消費するように見えることです。スレッドあたり 200MB のようなものなので、これは本当に私を制限しています。
ホストスレッドでストリームを作成し、ストリーム参照をワーカースレッドに渡すだけで、CUDA ライブラリにストリーム番号を渡すことができ、すべてが同じコンテキストで機能しますか?
ワーカー スレッドは、親スレッドと同じ CUDA コンテキストを自動的に認識しますか?
ありがとう
c++ - cudaコンテキストをワーカーpthreadに渡す
個々のpthreadで実行したいCUDAカーネルがいくつかあります。
基本的に、各pthread、たとえば3つのcudaカーネルを実行する必要があり、それらは順番に実行する必要があります。
各pthreadにストリームへの参照を渡そうと思ったので、これら3つのcudaカーネルはすべて、同じストリームで順番に実行されます。
これをpthreadの別のコンテキストで機能させることができます。これにより、カーネルが通常どおり実行されますが、これには多くのオーバーヘッドがかかるようです。
では、他のpthreadと同時に、各pthreadを同じコンテキストで動作させるにはどうすればよいですか?
ありがとう
cuda - ランタイムAPIアプリケーションでのcudaコンテキストの作成とリソースの関連付け
cudaランタイムAPIアプリケーションでcudaコンテキストが作成され、カーネルに関連付けられる方法を理解したいですか?
私はそれがドライバーAPIによって内部で行われていることを知っています。しかし、私は作成のタイムラインを理解したいと思います。
まず、cudaRegisterFatBinaryが最初に行われたcuda api呼び出しであり、実行時にfatbinファイルを登録することを知っています。その後に、ドライバー層でcuModuleLoadを呼び出すいくつかのcuda関数登録APIが続きます。しかし、私のCudaランタイムAPIアプリケーションがcudaMallocを呼び出す場合、コンテキストに関連付けられたこの関数へのポインターはどのように提供されますか。これは事前に作成されているはずです。このすでに作成されたコンテキストへのハンドルを取得し、将来のランタイムAPI呼び出しをそれに関連付けるにはどうすればよいですか?内部の仕組みをわかりやすく説明してください。
これに関するNVIDIAのドキュメントを引用するには
CUDAランタイムAPI呼び出しは、現在のホストスレッドにバインドされているCUDAドライバーAPICUcontextで動作します。
CUcontextを必要とするCUDAランタイムAPI呼び出し時に、現在のスレッドにバインドされたCUDAドライバーAPI CUcontextが存在しない場合、CUDAランタイムは呼び出しを実行する前に暗黙的に新しいCUcontextを作成します。
CUDAランタイムがCUcontextを作成する場合、CUcontextは、CUDAランタイムAPI関数cudaSetDevice、cudaSetValidDevices、cudaSetDeviceFlags、cudaGLSetGLDevice、cudaD3D9SetDirect3DDevice、cudaD3D10SetDirect3DDevice、およびcudaD3D11SetDirect3DDeviceによって指定されたパラメーターを使用して作成されます。これらの関数は、CUcontextが現在のホストスレッドにバインドされているときに呼び出された場合、cudaErrorSetOnActiveProcessで失敗することに注意してください。
CUcontextの存続期間は、参照カウントメカニズムによって管理されます。CUcontextの参照カウントは最初は0に設定され、cuCtxAttachによってインクリメントされ、cuCtxDetachによってデクリメントされます。
CUDAランタイムによってCUcontextが作成された場合、CUDAランタイムは関数cudaThreadExitでそのCUcontextの参照カウントをデクリメントします。CUcontextがCUDADriverAPIによって作成された場合(またはCUDA Runtime APIライブラリの別のインスタンスによって作成された場合)、CUDARuntimeはそのCUcontextの参照カウントをインクリメントまたはデクリメントしません。
すべてのCUDAランタイムAPIの状態(グローバル変数のアドレスや値など)は、基礎となるCUcontextとともに移動します。特に、CUcontextが1つのスレッドから別のスレッドに移動されると(cuCtxPopCurrentとcuCtxPushCurrentを使用)、すべてのCUDAランタイムAPIの状態もそのスレッドに移動します。
しかし、私が理解していないのは、cudaランタイムがどのようにコンテキストを作成するのかということです。これにはどのAPI呼び出しが使用されますか?nvccコンパイラはコンパイル時にこれを行うためにいくつかのAPI呼び出しを挿入しますか、それともこれは完全に実行時に行われますか?前者が当てはまる場合、このコンテキスト管理に使用されるランタイムAPIは何ですか?後者はどのように正確に行われているのですか?
コンテキストがホストスレッドに関連付けられている場合、このコンテキストにアクセスするにはどうすればよいですか?スレッドによって処理されるすべての変数とポインター参照に自動的に関連付けられていますか?
最終的に、モジュールのロードはコンテキストでどのように行われますか?
cuda - cuCtxCreate が CUDA_ERROR_INVALID_DEVICE で失敗する
cuCtxCreate を介して cuda コンテキストを作成すると、CUDA_ERROR_INVALID_DEVICE エラーが発生します。
私のコードは、コンテキストを作成し、そこからデバイスを取得して、新しいコンテキストを作成しています。
別のコンテキストを作成できない理由はありますか?
cuda - CUDA コンテキストを作成するには?
CUDA コンテキストを作成するにはどうすればよいですか? CUDA の最初の呼び出しが遅いため、カーネルを起動する前にコンテキストを作成したいと考えています。
cuda - ランタイムAPIによってドライバーAPIから作成されたコンテキストを使用する方法
リンク先のライブラリは、cudaランタイムAPIを使用しています。したがって、最初にcuda関数を呼び出すときに、暗黙的にcudaコンテキストを作成します。
私のコード(ライブラリを使用する)はドライバーAPIを使用する必要があります。では、どうすれば両方(ランタイムとドライバーAPI)を同時に動作させることができますか?
ライブラリは、ライブラリの初期化時にcudaSetDevice関数を呼び出します。(これを変更する方法はありません)。
どういうわけかコンテキストを決定し、それを使用するようにドライバーAPIに指示できますか?
cuda - cuCtxCreate が古いコンテキストを返すのはなぜですか?
インストールしました: CUDA sdk 4.2 64、CUDA ツールキット 4.2 64、CUDA devdriver 4.2 64、
\windows ですべての nvcuda.dll を確認しました - それらはすべて 4.2 バージョンですが、ドライバー API でコンテキストを作成し、cuCtxGetApiVersion でバージョンを確認すると、「3010」と表示されます
そのバージョンはあまり気にしませんが、そのコンテキストでランタイム API を使用しようとすると (それらを混在させる必要があります)、エラー 49(cudaErrorIncompatibleDriverContext) が表示されます。
何が起こっているのか、それを連携させる方法はありますか?
Windows の問題ではないようです。Linux で同じプロジェクトを実行すると、同じ 3010 API バージョンになります。
cuda - CUDAコンテキストの作成の違い
私は3つのカーネルを使用するプログラムを持っています。スピードアップを得るために、私は次のようにコンテキストを作成するためにダミーのメモリコピーを実行していました。
これは、次のように時間を計りたいカーネルの前に起動されます。
cudaFree(0)
また、またはとしてコンテキストを作成する他の最も簡単な方法についても読みましたcudaDevicesynchronize()
。ただし、これらのAPI呼び出しを使用すると、ダミーカーネルを使用するよりも時間がかかります。
コンテキストを強制した後のプログラムの実行時間は0.000031
、ダミーカーネルの場合は秒0.000064
、cudaDeviceSynchronize()とcudaFree(0)の両方の場合は秒です。時間は、プログラムの10回の個別実行の平均として取得されました。
したがって、私が到達した結論は、カーネルを起動すると、標準的な方法でコンテキストを作成するときに初期化されないものが初期化されるということです。
では、カーネルを使用する方法とAPI呼び出しを使用する方法の2つの方法でコンテキストを作成することの違いは何ですか?
LinuxでCUDA4.0を使用して、GTX480でテストを実行します。