問題タブ [gpgpu]
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 - 同時実行性、GPU リソースを取得するために競合する 4 つの CUDA アプリケーション
4 つの同時 CUDA アプリケーションが 1 つの GPU でリソースを求めて競合し、作業をグラフィック カードにオフロードできる場合はどうなるでしょうか?. Cuda Programming Guide 3.1 には、非同期の特定のメソッドがあると記載されています。
- カーネルの起動
- デバイス デバイス メモリのコピー
- 64 KB 以下のメモリ ブロックのホスト デバイス メモリ コピー
- Async のサフィックスが付いた関数によって実行されるメモリ コピー
- メモリーセット関数呼び出し
また、コンピューティング機能 2.0 を備えたデバイスは、カーネルが同じコンテキストに属している限り、複数のカーネルを同時に実行できることにも言及しています。
このタイプの同時実行は、単一の cuda アプリケーション内のストリームにのみ適用されますが、GPU リソースを要求する完全に異なるアプリケーションがある場合は不可能ですか??
これは、同時サポートが 1 つのアプリケーション (コンテキスト???) 内でのみ利用可能であり、4 つのアプリケーションが CPU のコンテキスト切り替えによってメソッドがオーバーラップする可能性がある方法で同時に実行されることを意味しますが、4 つのアプリケーションは待機する必要があります。 GPUが他のアプリケーションによって解放されるまで?(つまり、app4 からのカーネルの起動は、app1 からのカーネルの起動が完了するまで待機します。)
その場合、これら 4 つのアプリケーションは、長い待機時間に苦しむことなく GPU リソースにアクセスするにはどうすればよいでしょうか?
cuda - 同じインデックスに書き込むスレッドが多数あるCUDAカーネルをコーディングしますか?
CUDAでニューラルネットワークをアクティブ化するためのコードを書いていますが、問題が発生しています。特定のニューロンに入る重みの正しい合計が得られません。
これがカーネルコードです。変数を使ってもう少しわかりやすく説明します。
まず、ネットワーク内の接続数はですcLength
。すべての接続には、ソースニューロンとターゲットニューロン、およびその接続の重みがあります。SourceTargetArray
その情報が含まれています。したがって、のインデックスi
はsourceTargetArray
接続のソースニューロンインデックスであり、接続i
のターゲットニューロンインデックスですi
。にはweightArray
重み情報が含まれています(したがって、のインデックスi
はweightArray
接続に対応しますi
)。
ご覧のとおり、SumArray
ここに合計を保存しています。したがって、カーネルはsumArray
(接続のターゲットニューロンインデックスでi
)接続の重みの絶対値だけ増分しますi
。直感的には、ニューロンへのすべての着信接続について、すべての重みを合計します。私がこのカーネルでやろうとしているのはこれだけです。最終的には、この合計を使用して重みを正規化します。
問題はそれが間違っているということです。私はこれを連続して行いましたが、答えは異なります。答えは異なり、通常は約12〜15倍です(したがって、正しい答えは700.0になり、私が得ているのは50年代の範囲です)。
私が追加したことがわかります__threadfence()
(そして__threadfence_block()
、書き込みがすべてのスレッドによって同時に行われていないことを確認するために)。これが私のコードの問題かどうかはわかりません。ウェイト配列がテストしたシリアルバージョンと同一であり、ソース/ターゲット情報も同一であることを確認しました。私は何が間違っているのですか?
編集:参考までに、__threadfence()
usagedはCUDAプログラミングガイドv3.1付録B.5メモリフェンス機能で説明されています
c++ - 貧弱なopengl画像処理パフォーマンス
私はopenglを使用していくつかの簡単な画像処理を行おうとしています。このalrdyを実行する優れたライブラリが見つからなかったため、私は独自の解決策を実行しようとしてきました。
GPUでいくつかの画像を作成して、それらを読み返したいだけです。ただし、私の実装のパフォーマンスは、CPUで実行するパフォーマンスとほぼ同じように見えます...何かが間違っています...
私はネット上で見つけたベストプラクティスに従おうとしました。しかし、それでもそれは何か間違ったことをしています。
無関係なコードをすべて削除してみました。
この実装のパフォーマンスが低い理由について何か考えはありますか?
編集:
いくつかのプロファイリングを行いました。ほとんどのCPU時間はbegin_write()で費やされているようです。
でも何も悪いところは見えません...
cuda - GPGPU、OpenCL、CUDA、ATIストリーム
GPGPUがすでに存在するテクノロジーと、GPGPUを実装しているハードウェアベンダーを教えてください。
朝から色んなサイトの記事を読んでいて戸惑いました。
sdk - NVIDIAのSDKテンプレートでOpenCLとCUDAを混在させようとしています
デバイスのCUDAでメモリを割り当て、そのポインタをデバイスのメモリに取得し、OpenCLで使用して、結果を返すという実験を設定するのに苦労していました。これが可能かどうか見たいです。CUDAプロジェクトを機能させるのに苦労したので、SDKでNvidiaのテンプレートプロジェクトを使用しました。makefileで、common.mkのlibsセクションに-lOpenCLを追加しました。#include <CL/cl.h>
それを行うとすべて問題ありませんが、 openCL呼び出しを開始できるようにtemplate.cuに追加すると、100を超えるエラーが発生します。それらはすべてこれに似ていますが、最後に異なる関数名が付いています。
/usr/lib/gcc/x86_64-linux-gnu/4.4.1/include/xmmintrin.h(334):エラー:識別子「__builtin_ia32_cmpeqps」が未定義です
理由がわからない。できれば助けてください。また、CUDAおよびOpenCL APIを呼び出すことができるプロジェクトを設定する簡単な方法がある場合は、私に知らせてください。
opengl - GPU を使用したビットマップ変換
これが適切なフォーラムかどうかはわかりません。とにかくここで質問です。アプリケーションの 1 つで、医用画像を表示し、その上にアルゴリズムで生成されたビットマップを表示します。実際のビットマップは 16 ビットのグレー スケール ビットマップです。これから、ルックアップテーブルに基づいてカラービットマップを生成します。
ディスプレイは、256x256 の小さな画像でうまく機能しています。しかし、表示領域が 1024x1024 のように大きくなると、グレー スケールからカラー ビットマップへの変換に時間がかかり、インタラクションがスムーズではなくなります。最近、汎用 GPU プログラミングについてよく耳にします。私たちの展開では、ハイエンド (Nvidia QuadroFX) グラフィックス カードを使用しています。
私たちのアプリケーションは、必要に応じて .Net/C# を使用して構築されています。C++/CLI も少し追加できます。ここで私の質問は、このビットマップ変換をグラフィック プロセッサにオフロードできるかどうかです。さらに読むにはどこを探すべきですか?
c - CUDA カーネルが 2 つの異なる GPU で異なる結果をスローする (GeForce 8600M GT と Quadro FX 770M)
私は AES CUDA アプリケーションに取り組んでおり、GPU で ECB 暗号化を実行するカーネルを持っています。並列実行時にアルゴリズムのロジックが変更されないようにするために、NIST から提供された既知の入力テスト ベクトルを送信し、ホスト コードから出力を NIST から提供された既知のテスト ベクトル出力と比較します。8600M GT である NVIDIA GPU でこのテストを実行しました。これは Windows 7 で実行されており、ドライバーのバージョンは 3.0 です。このシナリオでは、すべてが完璧に機能し、アサートが成功します。
ここで、Quadro FX 770M でアプリケーションを実行すると、. 同じアプリケーションが起動され、同じテスト ベクトルが送信されますが、得られた結果は正しくなく、アサートは失敗します!!. これは、同じドライバー バージョンの Linux で実行されます。カーネルは 256 スレッドで実行されます。カーネル内で演算をスキップするために、事前に計算された 256 要素のルックアップ テーブルが使用されます。これらのテーブルはもともとグローバル メモリにロードされ、カーネルを起動する 256 のスレッドのうちの 1 つのスレッドが連携してルックアップ テーブルの 1 つの要素をロードし、その要素を共有メモリ内の新しいルックアップ テーブルに移動するため、アクセス レイテンシが減少します。
もともと、GPU 間のクロック速度の違いによる同期の問題について考えていました。そのため、スレッドが共有メモリにまだロードされていない値を使用していたり、何らかの形でまだ処理されていない値を使用していたりして、出力が混乱し、最終的に正しくなくなった可能性があります。
ここでは、既知のテスト ベクトルが宣言されているため、基本的には、カーネルのセットアップを担当する AES_set_encrption に送信されます。
ここでは、setup 関数がメモリの割り当て、カーネルの呼び出し、結果のホストへの送信を担当します。ホストに送り返す前に同期していることに注意してください。その時点ですべてが終了するはずです。これにより、問題はカーネル内にあると思われます..
最後に、カーネル内で一連の AES ラウンドを計算します。同期の問題はカーネル内にあると考えていたので、__syncthreads(); を設定しました。各ラウンドまたは計算操作の後、すべてのスレッドが同時に移動していることを確認して、計算されていない値が評価されないようにします..しかし、それでも問題は解決しませんでした..
正常に動作する 8600M GT GPU を使用した場合の出力は次のとおりです。
AES 256 ビットキー
NIST テスト ベクトル:
平文: 6bc1bee22e409f96e93d7e117393172a
キー: 603deb1015ca71be2b73aef0857d7781
暗号文: f3eed1bdb5d2a03c64b5a7e3db181f8
GPU 暗号化: f3eed1bdb5d2a03c64b5a7e3db181f8
テストのステータス: 合格
そして、Quadro FX 770M を使用して失敗した場合がこれです!!
AES 256 ビット キー NIST テスト ベクトル:
平文: 6bc1bee22e409f96e93d7e117393172a
キー: 603deb1015ca71be2b73aef0857d7781
暗号文: f3eed1bdb5d2a03c64b5a7e3db181f8
GPU 暗号化: c837204eb4c1063ed79c77946893b0
Generic assert memcmp (out, testCipherText, 16) == 0 はエラーをスローしました
テスト ステータス: 失敗
2 つの GPU が同じカーネルを処理しても異なる結果を計算する理由は何でしょうか? この問題を解決するためのヒントやトラブルシューティング、または手順を教えていただければ幸いです
前もって感謝します!!
cuda - GPGPU行列加算問題
巨大な行列があり、各セルが隣接するセルから数値の合計を取得するだけで、行列の出力を入力行列と同じサイズにする必要があります。
CUDA を使用して GPGPU プラットフォームでアプローチする方法を教えてもらえますか?
opengl-es - 組み込みプラットフォームで OpenGL ES 2.0 テクスチャ メモリに直接アクセスすることは可能ですか?
私は OMAP 3530 ベースのプラットフォームで GP-GPU コードに取り組んでいますが、openGL ES 2.0 に glGetTexImage 関数がないために行き詰まっています。プラットフォームは GPU に統合メモリを使用するため、メモリ内の割り当てられたテクスチャへのポインタを直接取得するためにできるハックがあるかどうか疑問に思っていました。このようにして、大量のデータを破棄するフレームバッファーを介してデータをプッシュすることなく、データを読み戻すことができました。
.net - F シャープで CUDA を使用して GPU アプリケーションを作成する可能性はありますか?
数値計算に F# を使用することに興味があります。F# で NVIDIA の CUDA 標準を使用して GPU にアクセスするにはどうすればよいですか?