問題タブ [cuda]
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.
c# - CUDA ドライバー API と CUDA ランタイム
CUDA アプリケーションを作成する場合、次の図に示すように、ドライバー レベルまたはランタイム レベルで作業できます (ライブラリは、高度な数学用の CUFFT および CUBLAS です)。
(ソース: tomshw.it )
この 2 つのトレードオフは、低レベルの API のパフォーマンスが向上することですが、コードの複雑さが増すという犠牲を払っていると思います。具体的な違いは何ですか?高レベル API では実行できない重要な点はありますか?
私は C# との相互運用に CUDA.net を使用しており、ドライバー API のコピーとしてビルドされています。これにより、C# でかなり複雑なコードを大量に記述することが奨励されますが、C++ に相当するものはランタイム API を使用するとより単純になります。このやり方で何か得があるのだろうか?私が理解できる利点の 1 つは、インテリジェントなエラー処理を他の C# コードと簡単に統合できることです。
c# - 非同期ジョブが完了するまでブロックする方法
NVIDIA の CUDA を使用して特定の作業タスクを GPU にオフロードする C# ライブラリに取り組んでいます。この例は、拡張メソッドを使用して 2 つの配列を一緒に追加することです。
このコードの作業は GPU 上で行われます。ただし、結果が必要な場合にのみCPUブロックでコードが実行されるように、非同期で実行したいと思います(結果がまだGPUで終了していない場合)。これを行うために、非同期実行を隠す ExecutionResult クラスを作成しました。使用中、これは次のようになります。
最後の行で、データの準備がまだ完了していない場合、プログラムはブロックされます。スレッドの同期などの経験があまりないため、ExecutionResult クラス内でこのブロッキング動作を実装する最善の方法については確信が持てません。
コンストラクターに渡されるアクションは、GPU で実際の作業を実行する非同期メソッドです。ネストされた Action は、非同期コールバック メソッドです。
私の主な関心事は、コンバーターで行われる待機を最適/最もエレガントに処理する方法ですが、問題全体を攻撃するためのより適切な方法があるかどうかです。さらに詳しく説明したり説明したりする必要がある場合は、コメントを残してください。
c# - 配列サブセットの効率的な取得
C# 配列のサブセットを取得して別のコードに渡す効率的な方法はありますか (元の配列を変更せずに)。配列を GPU にコピーする機能を持つ CUDA.net を使用します。たとえば、配列の 10 分の 1 の関数を渡し、配列の 10 分の 1 ずつを個別に (パイプライン処理の目的で) GPU にコピーしたいと考えています。
この方法で配列をコピーすると、一度にコピーするのと同じくらい効率的になります。安全でないコードを使用して適切なメモリの場所を参照するだけで実行できますが、それ以外はわかりません。CopyTo 関数は配列全体を別の配列にコピーするため、これは役に立ちません。
memory - CUDAでの定数メモリの動的割り当て
コンスタントメモリを利用しようとしていますが、配列をネストする方法を理解するのに苦労しています。私が持っているのは、内部データのカウントを持つデータの配列ですが、それらはエントリごとに異なります。したがって、次の簡略化されたコードに基づいて、2つの問題があります。まず、データ構造のメンバーが指すデータを割り当てる方法がわかりません。次に、定数メモリにcudaGetSymbolAddressを使用できないため、グローバルポインタを渡すことができるかどうかわかりません(プレーンな__device__メモリでは実行できません)。
提供された助けをありがとう。:-)
cuda - CUDAメモリのトラブル
特別なフラグなしでcubinファイルにコンパイルしているCUDAカーネルがあります。
コンパイルされますが、次のメッセージが表示されます。
アドバイザリ:グローバルメモリスペースを想定して、ポインタが何を指しているのかわかりません
一時的なcppファイルの行への参照。一見恣意的に見えるコードをコメントアウトすることで、これを機能させることができます。これは私には意味がありません。
カーネルは次のとおりです。
回線を入れ替えたら
この行の最初のforループの後
予告なしにコンパイルされます。これは、ラインの上のループの一見ランダムな部分をコメントアウトすることによっても達成できます。また、ローカルメモリアレイを通常のアレイに置き換えてみましたが、効果はありません。誰かが問題が何であるか教えてもらえますか?
システムはVista64ビットであり、その価値はあります。
編集:コードを修正して実際に機能するようにしましたが、それでもコンパイラー通知が生成されます。少なくとも正確さに関しては、警告が問題であるようには見えません(パフォーマンスに影響を与える可能性があります)。
c++ - CUDA: C++ でのデバイス メモリ割り当てのラッピング
私は現在 CUDA を使い始めており、C API に少しがっかりしていることを認めなければなりません。C を選択した理由は理解できますが、代わりに言語が C++ に基づいていた場合、デバイス メモリの割り当て (経由cudaMalloc
) など、いくつかの側面がより単純になったはずです。
operator new
私の計画は、オーバーロードされた配置new
と RAII (2 つの選択肢)を使用して、これを自分で行うことでした。今まで気付かなかった注意点があるのではないかと思っています。コードは機能しているように見えますが、メモリ リークの可能性についてまだ疑問に思っています。
RAIIコードの使用法は次のようになります。
おそらく、このコンテキストではクラスがやり過ぎなので(特に、cudaMemcpy
RAIIをカプセル化するだけのクラスを使用する必要があるため)、他のアプローチは配置new
になります:
ここでは、cudaDevice
単にオーバーロードをトリガーするタグとして機能します。ただし、通常の配置でnew
はこれは配置を示しているため、構文が奇妙に一貫しており、おそらくクラスを使用するよりも好ましいとさえ思います。
あらゆる種類の批判をいただければ幸いです。この方向の何かがCUDAの次のバージョンで計画されているかどうか誰かがおそらく知っていますか(私が聞いたように、それが意味するものは何でも、C++サポートが改善されます)。
したがって、私の質問は実際には 3 つあります。
- プレースメントの
new
オーバーロードは意味的に正しいですか? それはメモリをリークしますか? - この一般的な方向に進む将来の CUDA 開発に関する情報を誰かが持っていますか (それに直面しましょう: C++ s*ck の C インターフェイス)?
- これを一貫した方法でさらに進めるにはどうすればよいですか (他にも考慮すべき API があります。たとえば、デバイス メモリだけでなく、定数メモリ ストアとテクスチャ メモリもあります)。
ここで採用されているシングルトンについて: はい、その欠点は認識しています。ただし、これらはこのコンテキストには関係ありません。ここで必要だったのは、コピーできない小さなタイプのタグだけでした。他のすべて (つまり、マルチスレッドの考慮事項、初期化の時間) は適用されません。
hardware - 特殊用途の 3D グラフィックス計算には CUDA または FPGA を使用しますか?
3D グラフィックスの計算量が多く、最も近い点と範囲の検索が多い製品を開発しています。ハードウェアの最適化が役立つ場合があります。私はこれについてほとんど知りませんが、私の上司 (ソフトウェアの経験がない) は FPGA を推奨しています (カスタマイズできるため)。この質問には判断力が欠けているように感じますが、柔軟性についても心配しているため、CUDA が進むべき道だと思います。当社の製品はまだ強力に開発中です。
では、質問を言い換えると、FPGA を使用する理由はありますか? または、3番目のオプションはありますか?
cuda - Nvidia の CUDA を使用した圧縮ライブラリ
NVIDIA のCUDA ライブラリを使用して、標準の圧縮方法 (Zip、GZip、BZip2、LZMA など) を実装するプロジェクトを知っている人はいますか?
多くの並列タスク (圧縮など) を利用できるアルゴリズムは、デュアルまたはクアッドコア CPU よりもグラフィックス カードではるかに高速に実行されないのではないかと考えていました。
このようなアプローチの長所と短所についてどう思いますか?
cuda - CUDA アプリがタイムアウトし、数秒後に失敗します。これを回避するにはどうすればよいですか?
CUDA アプリケーションは、失敗して終了するまでの最大実行時間が 5 ~ 15 秒になる傾向があることに気付きました。CUDAアプリケーションをそれほど長く実行しないことが理想的であることは理解していますが、CUDAを使用するのが正しい選択であり、スレッドごとのシーケンシャル作業の量のためにそれを長く実行する必要があるため、この時間を延長する方法はありますか?それを回避するには?
c++ - CUDA + VisualStudio=抑制された出力ウィンドウ
通常、Visual Studioを使用してビルドを実行すると、出力ペインに警告とエラーが表示されます。
CUDAでGPUプログラミングを行っています。2.1にアップグレードすると、VisualStudioで有用な出力が得られなくなります。たとえば、私が今見ているのは次のとおりです。
その他の詳細はBuildLog.htmにありますが、そのファイルを常に探し出すのは不便です。
Visual Studioに出力ペインに出力を表示させる方法を知っている人はいますか?
役に立たないもの:
- CUDAのアンインストール:問題はすべてのプロジェクトで解決しません
- ツール>オプション>プロジェクトとソリューション>ビルドと実行>MSBuildプロジェクトビルドの出力の詳細度:このプルダウンを「診断」に変更しても、認識できる効果はありません。
編集:役に立たない追加の事柄:
- devenv.exe / resetsettings
- devenv.exe / resetuserdata
更新 (Die in Senteへの応答):現在、2台のマシンのいずれかで動作しています(ただし、修正するために何をしたかはわかりません)。まだ問題が発生しているマシンには、以前に同様の問題を引き起こしたCUDA VisualStudioWizardがインストールされています。まだ壊れているマシンには、バージョン15.00.21022.8のコンパイラがありました。動作中のマシンには15.00.30729.1があります。バックアップを作成した後、「C:\ Program Files(x86)\ Microsoft Visual Studio 9.0 \ VC \ BIN\amd64」を作業中のマシンから壊れたマシンに転送しました。壊れたマシンでの動作に変化は見られません。