問題タブ [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.
cuda - より良いパフォーマンスを得るためにcudaプログラムを最適化する方法は?
キーを生成するためのmatlabプログラム(cuda)を作成します。
より良いパフォーマンスを得るためにcudaプログラムを最適化する方法は?
rgb - GPUYUVからRGBへ。努力する価値はありますか?
いくつかのフルPALビデオ(720x576 @ 25)をYUV 4:2:2からRGBにリアルタイムで変換する必要があり、それぞれのサイズをカスタム変更する必要があります。これを行う例を見たので、GPUを使用することを考えました(4:4:4であるため、bppはソースと運命で同じです)-http: //www.fourcc.org/ソース/YUV420P-OpenGL-GLSLang.c
ただし、GPUを使用した経験がなく、何ができるかわかりません。この例では、私が理解しているように、ビデオフレームをYUVに変換して、画面に表示します。
代わりに処理されたフレームを取得することは可能ですか?それをGPUに送信し、変換して、メインメモリに再度送信することは、努力する価値がありますか、それともパフォーマンスを低下させますか?
私がウィンドウで作業していると仮定すると、少しプラットフォーム固有であるため、GPUがウィンドウに直接描画できるようにウィンドウからOpenGLまたはDirectDrawサーフェスを取得することは可能ですか?
java - JavaでのGPGPU/CUDA / OpenCLの最良のアプローチは?
グラフィックスプロセッシングユニット( GPGPU )での汎用コンピューティングは、あらゆる種類のコンピューティングにGPUのパワーを活用するための非常に魅力的なコンセプトです。
画像処理、パーティクル、高速の幾何学的操作にGPGPUを使用したいと思います。
現在、この分野での2つの候補はCUDAとOpenCLのようです。知りたいのですが:
- OpenCLはWindows/MacのJavaからまだ使用できますか?
- OpenCL / CUDAに接続するためのライブラリの方法は何ですか?
- JNAを直接使用するオプションはありますか?
- 私は何かを忘れていますか?
実世界の経験/例/戦争の話は大歓迎です。
gpu - NVIDIA GPU と PhysX エンジン
NVIDIA PhysX エンジンは NVIDIA GPU にどのように実装されていますか: これはコプロセッサですか、それとも物理アルゴリズムは GPU パイプラインで実行されるフラグメント プログラムとして実装されていますか?
algorithm - 最速の固定長6int配列
別のStackOverflowの質問(これ)に答えると、興味深いサブ問題に遭遇しました。6つの整数の配列をソートする最速の方法は何ですか?
質問は非常に低いレベルなので:
- ライブラリが利用可能であると想定することはできません(そして呼び出し自体にコストがかかります)。プレーンCのみです。
- 命令パイプライン(非常に高いコストがかかる)を空にすることを避けるために、おそらく分岐、ジャンプ、および他のすべての種類の制御フローの中断(
&&
またはのシーケンスポイントの背後に隠されているものなど)を最小限に抑える必要があり||
ます。 - 部屋には制約があり、レジスタとメモリの使用を最小限に抑えることが問題です。理想的には、インプレースソートがおそらく最善です。
本当にこの質問は、ソースの長さを最小化するのではなく、実行時間を最小化することが目標である一種のゴルフです。マイケル・アブラッシュとその続編による「コードの最適化の禅」という本のタイトルで使用されているように、私はそれを「Zening」コードと呼んでいます。
それが興味深い理由については、いくつかの層があります。
- この例は単純で、理解と測定が簡単で、Cスキルはあまり必要ありません。
- 問題に適したアルゴリズムを選択した場合の影響だけでなく、コンパイラと基盤となるハードウェアの影響も示しています。
これが私のリファレンス(ナイーブ、最適化されていない)の実装と私のテストセットです。
生の結果
バリアントの数が増えているので、ここにあるテストスイートにそれらをすべて集めました。使用された実際のテストは、Kevin Stockのおかげで、上に示したものよりも少し単純ではありません。独自の環境でコンパイルして実行できます。さまざまなターゲットアーキテクチャ/コンパイラでの動作に非常に興味があります。(OKみんな、答えに入れてください、私は新しい結果セットのすべての貢献者を+1します)。
私は1年前にダニエル・スタッツバッハ(ゴルフ用)に答えました。彼は当時最速のソリューション(ソーティングネットワーク)のソースでした。
Linux 64ビット、gcc 4.6.1 64ビット、Intel Core 2 Duo E8400、-O2
- qsortライブラリ関数への直接呼び出し:689.38
- ナイーブな実装(挿入ソート):285.70
- 挿入ソート(Daniel Stutzbach):142.12
- 挿入ソート展開:125.47
- ランク順:102.26
- レジスター付きランク順:58.03
- ソーティングネットワーク(Daniel Stutzbach):111.68
- ソーティングネットワーク(Paul R):66.36
- 高速スワップを使用したネットワーク12の並べ替え:58.86
- ソーティングネットワーク12の並べ替えスワップ:53.74
- ソーティングネットワーク12はSimpleSwapを並べ替えました:31.54
- 高速スワップ付きの並べ替えられたソーティングネットワーク:31.54
- 高速スワップV2を使用した並べ替えネットワーク:33.63
- インラインバブルソート(Paolo Bonzini):48.85
- 展開された挿入ソート(Paolo Bonzini):75.30
Linux 64ビット、gcc 4.6.1 64ビット、Intel Core 2 Duo E8400、-O1
- qsortライブラリ関数への直接呼び出し:705.93
- ナイーブな実装(挿入ソート):135.60
- 挿入ソート(Daniel Stutzbach):142.11
- 挿入ソート展開:126.75
- ランク順:46.42
- レジスター付きのランク順:43.58
- ソーティングネットワーク(Daniel Stutzbach):115.57
- ソーティングネットワーク(Paul R):64.44
- 高速スワップを使用したネットワーク12の並べ替え:61.98
- ソーティングネットワーク12の並べ替えスワップ:54.67
- ソーティングネットワーク12はSimpleSwapを並べ替えました:31.54
- 高速スワップ付きの並べ替えられたソーティングネットワーク:31.24
- 高速スワップV2を使用した並べ替えネットワーク:33.07
- インラインバブルソート(Paolo Bonzini):45.79
- 展開された挿入ソート(Paolo Bonzini):80.15
驚くべきことに、いくつかのプログラムではO2の効率がO1よりも低いため、-O1と-O2の両方の結果を含めました。どのような特定の最適化がこの効果をもたらすのだろうか?
提案されたソリューションに関するコメント
挿入ソート(Daniel Stutzbach)
予想通り、ブランチを最小化することは確かに良い考えです。
ソーティングネットワーク(Daniel Stutzbach)
挿入ソートよりも優れています。主な効果は外部ループを回避することから得られたのではないかと思いました。挿入ソートを展開して確認してみたところ、ほぼ同じ数値が得られました(コードはこちら)。
ソーティングネットワーク(Paul R)
これまでで最高。私がテストに使用した実際のコードはここにあります。他のソーティングネットワークの実装のほぼ2倍の速度である理由はまだわかりません。パラメータの受け渡し?ファストマックス?
高速スワップを使用したネットワーク12SWAPの並べ替え
Daniel Stutzbachが提案したように、私は彼の12スワップソーティングネットワークをブランチレス高速スワップと組み合わせました(コードはここにあります)。それは確かに高速であり、1つ少ないスワップを使用して期待できるように、わずかなマージン(約5%)でこれまでのところ最高です。
ブランチレススワップは、PPCアーキテクチャでifを使用する単純なスワップよりもはるかに(4倍)効率が低いように見えることにも注目してください。
ライブラリqsortの呼び出し
別の参照ポイントを与えるために、私は提案されたようにライブラリqsortを呼び出すことも試みました(コードはここにあります)。予想どおり、はるかに遅くなります。10〜30倍遅くなります...新しいテストスイートで明らかになったように、主な問題は最初の呼び出し後のライブラリの初期ロードであるように見え、他のライブラリと比べてもそれほど悪くはありません。バージョン。私のLinuxでは3倍から20倍遅いです。他の人がテストに使用する一部のアーキテクチャでは、さらに高速に見えるようです(ライブラリqsortはより複雑なAPIを使用しているため、このアーキテクチャには本当に驚いています)。
順位
Rex Kerrは、まったく異なる別の方法を提案しました。配列の各項目について、その最終位置を直接計算します。ランク順の計算には分岐が必要ないため、これは効率的です。この方法の欠点は、配列の3倍のメモリ量(ランク順を格納するための配列と変数の1つのコピー)を必要とすることです。パフォーマンスの結果は非常に驚くべきものです(そして興味深いものです)。32ビットOSとIntelCore2Quad E8300を使用したリファレンスアーキテクチャでは、サイクル数は1000をわずかに下回りました(分岐スワップを使用したネットワークの並べ替えなど)。しかし、64ビットボックス(Intel Core2 Duo)でコンパイルして実行すると、パフォーマンスが大幅に向上しました。これまでのところ最速になりました。私はついに本当の理由を見つけました。私の32ビットボックスはgcc4.4.1を使用し、64ビットボックスはgcc4.4を使用します。
更新:
上記の公開された図が示すように、この効果はgccの新しいバージョンによってさらに強化され、ランク順は他の代替手段の2倍の速度になりました。
並べ替えられたスワップを使用したネットワーク12の並べ替え
gcc4.4.3を使用したRexKerr提案の驚くべき効率は、私に不思議に思いました。メモリ使用量が3倍のプログラムは、ブランチレスソーティングネットワークよりもどのように高速でしょうか。私の仮説は、書き込み後に読み取られる種類の依存関係が少なく、x86のスーパースカラー命令スケジューラをより適切に使用できるようにするというものでした。それは私にアイデアを与えました:書き込み後の読み取り依存関係を最小化するためにスワップを並べ替えます。もっと簡単に言えSWAP(1, 2); SWAP(0, 2);
ば、両方が共通のメモリセルにアクセスするため、最初のスワップが終了するのを待ってから2番目のスワップを実行する必要があります。これを行うとSWAP(1, 2); SWAP(4, 5);
、プロセッサは両方を並行して実行できます。私はそれを試しましたが、期待どおりに機能し、ソーティングネットワークは約10%高速に実行されています。
単純なスワップを使用したネットワーク12の並べ替え
Steinar H. Gundersonが最初の投稿から1年後、コンパイラーの裏をかくことを試みて、スワップコードを単純に保つべきではないと提案しました。結果のコードは約40%速いので、それは確かに良い考えです!彼はまた、x86インラインアセンブリコードを使用して手動で最適化されたスワップを提案しました。最も驚くべきことは(プログラマーの心理学に関するボリュームを示しています)、1年前にそのバージョンのスワップを試した人は誰もいなかったことです。私がテストに使用したコードはここにあります。他の人は、C高速スワップを書く他の方法を提案しましたが、それはまともなコンパイラを備えた単純なものと同じパフォーマンスをもたらします。
「最良の」コードは次のとおりです。
私たちのテストセットを信じるなら(そして、はい、それはかなり貧弱です、それは私たちが測定しているものを短く、単純で理解しやすいという単なる利点です)、1つのソートの結果のコードの平均サイクル数は40サイクル未満です( 6つのテストが実行されます)。これにより、各スワップは平均4サイクルになります。私はそれを驚くほど速く呼んでいます。他に可能な改善はありますか?
opengl - アルファ値を保存しないテクスチャへの GLSL シェーダ レンダリング
更新:Danvil が以下のコメントで解決しました。私のテクスチャ フォーマットは GL_RGBA ではなく GL_RGB でした。これはもちろん、アルファ値が保持されないことを意味します。なぜ気づかなかったのかわからない... ありがとう、ダンヴィル。
GLSL シェーダを使用してテクスチャにレンダリングし、そのテクスチャを入力として 2 番目のシェーダに送信しています。最初のテクスチャでは、RGB チャネルを使用してカラー データを 2 番目の GLSL シェーダに送信していますが、アルファ チャネルを使用して、2 番目のシェーダがプログラムの一部として使用する浮動小数点数を送信したいと考えています。問題は、2 番目のシェーダーでテクスチャを読み取ると、アルファ値が常に 1.0 になることです。これを次の方法でテストしました。
最初のシェーダーの最後に、次のようにしました。
次に、2番目のテクスチャで、次のようなものを使用して最初のテクスチャの値を読み取ります
出力に黒のピクセルはありませんが、上記のコードを読み取りに変更すると
そして2番目のシェーダーで
該当するピクセルはすべて黒です。これは、何らかの理由で、最初のシェーダーでアルファ値を 1.0 以外に設定してテクスチャにレンダリングすると、2 番目のシェーダーでは 1.0 として表示されることを意味します。
テクスチャにレンダリングする前に glDisable(GL_BLEND);
問題は、私が望む方法で青チャネルを使用できるため、私には明らかではない方法でアルファ値を処理する OpenGL に関係していることは明らかであり、そこにいる誰かがすぐに問題に気付くと考えました。 .
また、シェーダー プログラムを呼び出す方法は、クワッドを描画することです (テクスチャを持つフレーム バッファーにレンダリングしています)。
cuda - GPGPU 上の金融アプリケーション
GPGPU を使用して実装できる金融アプリケーションの種類を知りたいです。CUDA を使用した GPGPU でのモンテカルロ シミュレーションを使用したオプション価格設定/株価推定については承知しています。金融分野のあらゆるアプリケーションで GPGPU を利用するさまざまな可能性を挙げてください。
floating-point - CUDA の倍精度浮動小数点
CUDA は倍精度浮動小数点数をサポートしていますか?
また、同じ理由は何ですか?
cuda - GPUプログラミングのためのDirectCompute対OpenCL?
GPUコンピューティングにうまく対応する必要のある(財務上の)タスクがいくつかありますが、OpenCLとDirectComputeのどちらを使用すべきかはよくわかりません。私はGPUコンピューティングをいくつか行いましたが、それはずっと前(3年)でした。当時は実際には代替手段がなかったので、OpenGLを介してそれを行いました。
私はいくつかのOpenCLプレゼンテーションを見てきましたが、それは本当に素晴らしく見えます。DirectComputeについてはまだ何も見ていませんが、それも良いと思います。
現時点では、クロスプラットフォームの互換性には関心がありません。さらに、2つのモデルは、一方から他方に移動しようとしたときに大きな頭痛の種を引き起こさない程度に類似していると思います。
それで、あなたはこれらの2つのいずれかを使用しましたか?特にDirectCompute?OpenCL(およびCUDA)と比較してどうですか?