GPUの使用法。 GPUアクセラレーションを有効にします。 GPUコンピューティングの開発の問題

AMD /ATIRadeonアーキテクチャの機能

これは、生息地の発達中に生物が環境への適応性を改善するために進化するときの、新しい生物種の誕生に似ています。 そのため、GPUは、三角形のラスタライズとテクスチャリングの高速化から始めて、これらの同じ三角形に色を付けるためのシェーダープログラムを実行する追加の機能を開発しました。 そして、これらの機能は、非グラフィックコンピューティングで需要があることが判明しました。場合によっては、従来のソリューションと比較して大幅なパフォーマンスの向上が見られます。

私たちはさらに類推を描きます-陸での長い進化の後、哺乳類は海に侵入し、そこで彼らは普通の海洋生物を押し出しました。 競争の激しい戦いの中で、哺乳類は地表に現れた新しい高度な能力と、水中での生活に適応するために特別に獲得した能力の両方を使用しました。 同様に、GPUは、3Dグラフィックスのアーキテクチャの利点に基づいて、グラフィックス以外のタスクに役立つ特別な機能をますます獲得しています。

では、GPUが汎用プログラムの分野で独自のセクターを主張できるのはなぜですか? GPUのマイクロアーキテクチャは、従来のCPUとは非常に異なる方法で構築されており、最初から特定の利点があります。 グラフィックタスクにはデータの独立した並列処理が含まれ、GPUはネイティブにマルチスレッド化されています。 しかし、この並列性は彼にとってただの喜びです。 マイクロアーキテクチャは、実行する必要のある多数のスレッドを活用するように設計されています。

GPUは、数十(Nvidia GT200の場合は30、Evergreenの場合は20、Fermiの場合は16)のプロセッサコアで構成され、Nvidiaの用語ではストリーミングマルチプロセッサ、ATIの用語ではSIMDエンジンと呼ばれます。 この記事のフレームワーク内では、ミニプロセッサと呼びます。これは、数百のプログラムスレッドを実行し、通常のCPUが実行できるほとんどすべてのことを実行できるためですが、それでもすべてではありません。

マーケティング名は紛らわしいです-それらは、より重要なことに、減算および乗算できる機能モジュールの数を示します。たとえば、320のベクトル「コア」(コア)。 これらのカーネルは、穀物のようなものです。 GPUは、多くのコアが同時に多くのスレッドを実行するマルチコアプロセッサと考える方がよいでしょう。

各ミニプロセッサにはローカルメモリがあり、GT200用に16 KB、Evergreen用に32 KB、Fermi用に64 KB(基本的にプログラム可能なL1キャッシュ)です。 従来のCPUのL1キャッシュと同様のアクセス時間があり、データを機能モジュールにできるだけ早く配信するという同様の機能を実行します。 Fermiアーキテクチャでは、ローカルメモリの一部を通常のキャッシュとして構成できます。 GPUでは、ローカルメモリを使用して、実行中のスレッド間でデータをすばやく交換します。 GPUプログラムの通常のスキームの1つは、次のとおりです。まず、GPUのグローバルメモリからのデータがローカルメモリにロードされます。 これは、「独自の」プロセッサとは別に配置された(システムメモリのような)通常のビデオメモリです。ビデオの場合、ビデオカードのテキストライト上のいくつかのマイクロ回路によってはんだ付けされています。 次に、数百のスレッドがローカルメモリ内のこのデータを処理し、結果をグローバルメモリに書き込みます。その後、CPUに転送されます。 ローカルメモリからデータをロードおよびアンロードするための命令を作成するのは、プログラマーの責任です。 本質的に、これは並列処理のための[特定のタスクの]データの分割です。 GPUは、メモリへのアトミック書き込み/読み取り命令もサポートしますが、非効率的であり、通常、すべてのミニプロセッサの計算結果を「接着」するための最終段階で必要になります。

ローカルメモリは、ミニプロセッサで実行されているすべてのスレッドに共通であるため、たとえば、Nvidiaの用語では共有と呼ばれることもあり、ローカルメモリという用語は正反対を意味します。つまり、グローバルの別のスレッドの特定のパーソナルエリアです。メモリ、表示され、それにのみアクセス可能。 ただし、ミニプロセッサには、ローカルメモリに加えて、すべてのアーキテクチャで、ボリュームが約4倍の別のメモリ領域があります。 実行中のすべてのスレッド間で均等に分割されます。これらは、変数と計算の中間結果を格納するためのレジスタです。 各スレッドには数十のレジスタがあります。 正確な数は、ミニプロセッサが実行しているスレッドの数によって異なります。 グローバルメモリのレイテンシは非常に高く、数百サイクルであり、キャッシュがない場合、計算の中間結果を保存する場所がないため、この数値は非常に重要です。

そして、GPUのもう1つの重要な機能は、「ソフト」ベクトル化です。 各ミニプロセッサには多数の計算モジュール(GT200用に8個、Radeon用に16個、Fermi用に32個)がありますが、同じプログラムアドレスで同じ命令しか実行できません。 この場合のオペランドは異なる可能性があり、異なるスレッドには独自のものがあります。 たとえば、命令 2つのレジスタの内容を追加します:すべてのコンピューティングデバイスで同時に実行されますが、異なるレジスタが使用されます。 データの並列処理を実行するGPUプログラムのすべてのスレッドは、通常、プログラムコード内を並列に移動すると想定されています。 したがって、すべてのコンピューティングモジュールが均等にロードされます。 また、プログラムの分岐が原因でスレッドがコード実行のパスで分岐した場合、いわゆるシリアル化が発生します。 次に、すべてのコンピューティングモジュールが使用されるわけではありません。スレッドは実行のために異なる命令を送信し、コンピューティングモジュールのブロックは、すでに述べたように、1つのアドレスを持つ命令のみを実行できます。 そしてもちろん、同時にパフォーマンスは最大値に比べて低下します。

利点は、ベクトル化が完全に自動化されており、SSEやMMXなどを使用してプログラミングされていないことです。 そして、GPU自体が不一致を処理します。 理論的には、実行中のモジュールのベクトルの性質を考慮せずにGPU用のプログラムを作成することは可能ですが、そのようなプログラムの速度はそれほど速くありません。 欠点は、ベクトルの幅が広いことです。 これは、機能モジュールの呼び数を超えており、Nvidia GPUの場合は32、Radeonの場合は64です。 スレッドは適切なサイズのブロックで処理されます。 Nvidiaは、このスレッドのブロックをワープ、AMD、波面と呼んでいます。これは同じことです。 したがって、16個のコンピューティングデバイスでは、64スレッド長の「波面」が4サイクルで処理されます(通常の命令長を想定)。 この場合、作者は経糸という用語を好みます。これは、航海用語の経糸と関連しているため、ねじれたロープから結ばれたロープを意味します。 したがって、スレッドは「ねじれ」、一体のバンドルを形成します。 ただし、「波面」は海と関連付けることもできます。波が次々と岸に転がるのと同じ方法で、命令がアクチュエータに到着します。

プログラムの実行ですべてのスレッドが同じように進行し(同じ場所にある)、同じ命令を実行する場合、すべてが正常ですが、そうでない場合は速度が低下します。 この場合、同じ経糸または波面の糸はプログラムの異なる場所にあり、糸のグループに分けられます。 同じ値命令番号(つまり、命令ポインタ)。 また、以前と同様に、一度に実行されるのは1つのグループのスレッドのみです。これらはすべて同じ命令を実行しますが、オペランドが異なります。 その結果、ワープは何倍も遅く実行され、いくつのグループに分割され、グループ内のスレッドの数は重要ではありません。 グループが1つのスレッドのみで構成されている場合でも、フルワープと同じくらい実行に時間がかかります。 ハードウェアでは、これは特定のスレッドをマスクすることによって実装されます。つまり、命令は正式に実行されますが、実行結果はどこにも記録されず、将来使用されません。

各ミニプロセッサ(ストリーミングマルチプロセッサまたはSIMDエンジン)は、常に1つのワープ(スレッドの束)にのみ属する命令を実行しますが、実行可能プールには数十のアクティブなワープがあります。 ミニプロセッサは、あるワープの命令を実行した後、このワープのスレッドの次の命令ではなく、ワープ内の他の誰かの命令を実行します。 そのワープはプログラム内の完全に異なる場所にある可能性があります。これは速度に影響しません。ワープ内でのみ、フルスピードで実行するためにすべてのスレッドの命令が同じである必要があるためです。

この場合、20個のSIMDエンジンのそれぞれに、それぞれ64個のスレッドを持つ4つのアクティブな波面があります。 各スレッドは短い線で示されます。 合計:64×4×20=5120スレッド

したがって、各ワープまたは波面が32〜64のスレッドで構成されているとすると、ミニプロセッサには、ほぼ同時に実行されている数百のアクティブなスレッドがあります。 以下では、このような多数の並列スレッドがもたらすアーキテクチャ上の利点を示しますが、最初に、GPUを構成するミニプロセッサにどのような制限があるかを検討します。

主なことは、GPUには、関数パラメーターとローカル変数を格納できるスタックがないことです。 スタックのスレッド数が多いため、チップ上にスペースがありません。 実際、GPUは100 KBのシングルスレッドスタックサイズで約10,000スレッドを同時に実行するため、合計量は1 GBになります。これは、すべてのビデオメモリの標準量に相当します。 さらに、GPUコア自体に重要なサイズのスタックを配置する方法はありません。 たとえば、スレッドごとに1000バイトのスタックを配置すると、1つのミニプロセッサだけで1 MBのメモリが必要になります。これは、ミニプロセッサのローカルメモリとレジスタの格納に割り当てられたメモリの合計量のほぼ5倍です。

したがって、GPUプログラムには再帰がなく、関数呼び出しで実際に向きを変えることはできません。 プログラムのコンパイル時に、すべての関数がコードに直接置き換えられます。 これにより、GPUの範囲が計算タスクに制限されます。 既知の小さな反復深度を持つ再帰アルゴリズムにグローバルメモリを使用して制限付きスタックエミュレーションを使用できる場合がありますが、これは一般的なGPUアプリケーションではありません。 これを行うには、CPUと比較して正常なアクセラレーションを保証せずに、その実装の可能性を調査するために、特別にアルゴリズムを開発する必要があります。

Fermiは最初に仮想関数を使用する機能を導入しましたが、繰り返しになりますが、各スレッドに大規模で高速なキャッシュがないため、仮想関数の使用は制限されています。 1536スレッドは48KBまたは16KBL1を占めます。つまり、プログラム内の仮想関数は比較的まれにしか使用できません。そうしないと、スタックが低速のグローバルメモリを使用するため、実行速度が低下し、比較してメリットが得られない可能性があります。 CPUバージョンに。

したがって、GPUは計算コプロセッサーとして提示され、データがロードされ、何らかのアルゴリズムによって処理され、結果が生成されます。

アーキテクチャの利点

しかし、GPUは非常に高速であると考えています。 そしてこれで彼は彼の高いマルチスレッドによって助けられています。 アクティブなスレッドの数が多いと、別々に配置されたグローバルビデオメモリの大きな遅延(約500サイクル)を部分的に隠すことができます。 これは、算術演算の密度が高いコードに対して特に適切に平準化されます。 したがって、トランジスタの高価なL1-L2-L3キャッシュ階層は必要ありません。 代わりに、多くのコンピューティングモジュールをチップに配置して、卓越した演算性能を提供できます。 その間、1つのスレッドまたはワープの命令が実行され、他の数百のスレッドが静かにデータを待機しています。

Fermiは約1MBの第2レベルのキャッシュを導入しましたが、最新のプロセッサのキャッシュと比較することはできません。コア間の通信やさまざまなソフトウェアトリックを対象としています。 そのサイズを数万のスレッドすべてに分割すると、それぞれの量はごくわずかになります。

ただし、グローバルメモリのレイテンシに加えて、コンピューティングデバイスには非表示にする必要のあるレイテンシがさらに多くあります。 これは、コンピューティングデバイスから第1レベルのキャッシュ(GPUのローカルメモリ)、レジスタ、および命令キャッシュへのチップ内のデータ転送のレイテンシです。 レジスタファイルとローカルメモリは機能モジュールとは別に配置されており、それらへのアクセス速度は約12サイクルです。 また、多数のスレッド、アクティブなワープは、このレイテンシーを効果的に隠すことができます。 さらに、GPU全体のローカルメモリへのアクセスの合計帯域幅(帯域幅)は、それを構成するミニプロセッサの数を考慮に入れると、最新のCPUの第1レベルのキャッシュへのアクセスの帯域幅よりもはるかに大きくなります。 GPUは、単位時間あたりに大幅に多くのデータを処理できます。

GPUに多数の並列スレッドが提供されていない場合、GPUは完全にロードされているかのように同じペースで動作し、作業量がはるかに少ないため、パフォーマンスはほぼゼロになるとすぐに言えます。 たとえば、10,000ではなく1つのスレッドだけを残します。すべてのブロックがロードされるだけでなく、すべてのレイテンシも影響するため、パフォーマンスは約1000倍低下します。

レイテンシーを隠す問題は、最新の高周波CPUでも深刻です。レイテンシーを排除するために高度な方法が使用されています。つまり、深いパイプライン化、命令のアウトオブオーダー実行(アウトオブオーダー)です。 これには、複雑な命令実行スケジューラやさまざまなバッファなどが必要であり、チップ上のスペースを占有します。 これはすべて、シングルスレッドモードで最高のパフォーマンスを実現するために必要です。

ただし、GPUの場合、これはすべて必要ではありません。多数のスレッドを使用する計算タスクの場合、アーキテクチャ的に高速です。 代わりに、賢者の石が鉛を金に変えるように、マルチスレッドをパフォーマンスに変換します。

GPUは元々、三角形ピクセルのシェーダープログラムを最適に実行するように設計されていました。これは明らかに独立しており、並列で実行できます。 そして、この状態から、さまざまな機能(ローカルメモリとビデオメモリへのアドレス可能なアクセス、および命令セットの複雑化)を非常に強力なコンピューティングデバイスに追加することで進化しました。これは、高度な並列実装を可能にするアルゴリズムにのみ効果的に適用できます。限られた量のローカルメモリを使用します。メモリ。

最も古典的なGPUの問題の1つは、重力場を作成するN体の相互作用を計算する問題です。 しかし、たとえば、Earth-Moon-Sunシステムの進化を計算する必要がある場合、GPUは私たちにとって悪いヘルパーです。オブジェクトはほとんどありません。 オブジェクトごとに、他のすべてのオブジェクトとの相互作用を計算する必要があり、そのうちの2つだけがあります。 すべての惑星とその衛星(約数百のオブジェクト)を含む太陽系の動きの場合、GPUはまだあまり効率的ではありません。 ただし、マルチコアプロセッサは、スレッド管理のオーバーヘッドコストが高いため、その能力をすべて発揮することはできず、シングルスレッドモードで動作します。 ただし、彗星や小惑星帯のオブジェクトの軌道も計算する必要がある場合は、必要な数の並列計算スレッドを作成するのに十分なオブジェクトがあるため、これはすでにGPUのタスクです。

GPUは、数十万の星の球状星団の衝突を計算する必要がある場合にもうまく機能します。

N体問題でGPUの能力を使用する別の機会は、少数の体ではあるが、多くの個別の問題を計算する必要がある場合に現れます。 たとえば、初速度のさまざまなオプションについて1つのシステムの進化を計算する場合です。 そうすれば、GPUを問題なく効果的に使用できるようになります。

AMDRadeonマイクロアーキテクチャの詳細

GPU編成の基本原則を検討しました。最初は、シェーダープログラムという1つのターゲットタスクがあったため、すべてのメーカーのビデオアクセラレータに共通です。 ただし、製造業者は、マイクロアーキテクチャの実装の詳細について意見が一致しない可能性があることを発見しました。 Pentium 4とAthlonまたはCoreのように、互換性がある場合でも、ベンダーごとにCPUが大きく異なる場合があります。 Nvidiaのアーキテクチャはすでに広く知られています。次に、Radeonを見て、これらのベンダーのアプローチの主な違いを強調します。

AMDグラフィックスカードは、DirectX 11仕様のパイオニアでもあるEvergreenファミリー以来、汎用コンピューティングを完全にサポートしています。47xxファミリーカードには、以下で説明するいくつかの重要な制限があります。

ローカルメモリサイズの違い(Radeonの場合は32 KB、GT200の場合は16 KB、Fermiの場合は64 KB)は、一般的に基本的なものではありません。 また、AMDの波面サイズは64スレッドであるのに対し、Nvidiaの波面サイズはワープあたり32スレッドです。 ほとんどすべてのGPUプログラムは、これらのパラメーターに合わせて簡単に再構成および調整できます。 パフォーマンスは数十パーセント変化する可能性がありますが、GPUの場合、GPUプログラムは通常CPUの対応するプログラムの10倍遅いか、10倍速いか、まったく機能しないため、これはそれほど重要ではありません。

さらに重要なのは、AMDによるVLIW(Very Long Instruction Word)テクノロジーの使用です。 Nvidiaはスカラーを使用します 簡単な手順、スカラーレジスタで動作します。 そのアクセラレータは、単純な古典的なRISCを実装します。 AMDグラフィックカードにはGT200と同じ数のレジスタがありますが、レジスタは128ビットベクトルです。 各VLIW命令は、SSEに似たいくつかの4コンポーネント32ビットレジスタで動作しますが、VLIWの機能ははるかに広いです。 これはSSEのようなSIMD(単一命令複数データ)ではありません-ここでは、オペランドの各ペアの命令は異なり、依存することさえあります! たとえば、レジ​​スタAのコンポーネントにa1、a2、a3、a4という名前を付けます。 レジスターBの場合-同様に。 たとえば、数値a1×b1+a2×b2+a3×b3+a4×b4または2次元ベクトル(a1×b1 + a2×b2、a3× b3 + a4×b4)。

これは、GPUの周波数がCPUよりも低く、近年の技術プロセスの大幅な減少のおかげで可能になりました。 これにはスケジューラは必要ありません。ほとんどすべてがクロックごとに実行されます。

ベクトル命令を使用すると、Radeonのピーク単精度パフォーマンスはテラフロップスで非常に高くなります。

1つのベクトルレジスタは、4つの単精度数の代わりに1つの倍精度数を格納できます。 また、1つのVLIW命令は、2組のdoubleを加算するか、2つの数値を乗算するか、2つの数値を乗算して3番目に加算することができます。 したがって、doubleのピークパフォーマンスはfloatの約5分の1になります。 古いRadeonモデルの場合、新しいFermiアーキテクチャでのNvidia Teslaのパフォーマンスに対応し、GT200アーキテクチャでのダブルカードのパフォーマンスよりもはるかに高くなります。 Fermiをベースにした消費者向けGeforceビデオカードでは、二重計算の最大速度が4分の1に低下しました。


Radeonの作業の概略図。 並行して実行されている20個のうち1個のミニプロセッサのみが示されています

GPUメーカーは、CPUメーカー(まず第一に、x86互換のメーカー)とは異なり、互換性の問題に縛られていません。 GPUプログラムは最初にいくつかの中間コードにコンパイルされ、プログラムが実行されると、ドライバーはこのコードをに固有のマシン命令にコンパイルします。 特定のモデル。 上記のように、GPUメーカーは、GPU用の便利なISA(命令セットアーキテクチャ)を発明し、世代から世代へと変更することで、これを利用しました。 いずれにせよ、これにより、デコーダーが(不要として)不足しているため、パフォーマンスがある程度向上しました。 しかし、AMDはさらに進んで、機械語で命令を配置するための独自のフォーマットを発明しました。 それらは(プログラムリストに従って)順番に配置されるのではなく、セクションに配置されます。

最初に、条件付きジャンプ命令のセクションがあります。これには、さまざまな分岐分岐に対応する連続算術命令のセクションへのリンクがあります。 それらはVLIWバンドル(VLIW命令のバンドル)と呼ばれます。 これらのセクションには、レジスタまたはローカルメモリからのデータを含む算術命令のみが含まれています。 このような組織は、命令の流れと実行ユニットへの命令の配信を簡素化します。 VLIW命令が比較的大きいことを考えると、これはさらに便利です。 メモリアクセス命令のセクションもあります。

条件付き分岐命令セクション
セクション0分岐0連続算術命令のセクション#3へのリンク
セクション1分岐1セクション4へのリンク
第2節分岐2セクション5へのリンク
連続算術命令のセクション
セクション3VLIW命令0VLIW命令1VLIW命令2VLIW命令3
セクション4VLIW命令4VLIW命令5
セクション5VLIW命令6VLIW命令7VLIW命令8VLIW命令9

両方のメーカー(NvidiaとAMDの両方)のGPUには、数サイクルで単一の精度の数値の基本的な数学関数、平方根、指数、対数、正弦、および余弦をすばやく計算するための組み込み命令もあります。 これには特別な計算ブロックがあります。 それらは、ジオメトリシェーダーでこれらの関数の高速近似を実装する必要性から「生まれました」。

GPUがグラフィックスに使用されていることを知らず、技術的な特性に精通しているだけでも、この兆候から、これらのコンピューティングコプロセッサーはビデオアクセラレーターに由来していると推測できます。 同様に、海洋哺乳類のいくつかの特徴により、科学者は彼らの祖先が陸生生物であると信じるようになりました。

しかし、デバイスのグラフィカルな原点を示すより明白な機能は、双一次補間をサポートする2次元および3次元のテクスチャを読み取るためのブロックです。 これらは、読み取り専用データ配列の読み取りを高速かつ容易にするため、GPUプログラムで広く使用されています。 GPUアプリケーションの標準的な動作の1つは、初期データの配列を読み取り、それらを計算コアで処理し、その結果を別の配列に書き込んでから、CPUに戻すことです。 このようなスキームは、GPUアーキテクチャに便利なため、標準的で一般的です。 グローバルメモリの1つの大きな領域への集中的な読み取りと書き込みを必要とし、データの依存関係を含むタスクは、GPUに並列化して効率的に実装するのが困難です。 また、それらのパフォーマンスは、非常に大きいグローバルメモリのレイテンシに大きく依存します。 しかし、タスクが「データの読み取り-処理-結果の書き込み」というパターンで記述されている場合、GPUでの実行からほぼ確実に大きな後押しを得ることができます。

GPUのテクスチャデータの場合、第1レベルと第2レベルの小さなキャッシュの個別の階層があります。 また、テクスチャの使用による加速も提供します。 この階層は元々、テクスチャへのアクセスの局所性を利用するためにGPUに表示されました。明らかに、1つのピクセルを処理した後、隣接するピクセル(高い確率で)には、間隔の狭いテクスチャデータが必要になります。 しかし、従来のコンピューティングの多くのアルゴリズムは、データアクセスの性質が似ています。 したがって、グラフィックからのテクスチャキャッシュは非常に便利です。

NvidiaカードとAMDカードのL1-L2キャッシュのサイズはほぼ同じですが、これは明らかにゲームグラフィックスの最適性の要件が原因ですが、これらのキャッシュへのアクセスの遅延は大幅に異なります。 Nvidiaのアクセスレイテンシはより高く、Geforceのテクスチャキャッシュは、データアクセスを直接高速化するのではなく、主にメモリバスの負荷を軽減するのに役立ちます。 これはグラフィックプログラムでは目立ちませんが、汎用プログラムでは重要です。 Radeonでは、テクスチャキャッシュのレイテンシは低くなりますが、ミニプロセッサのローカルメモリのレイテンシは高くなります。 次に例を示します。Nvidiaカードで最適な行列乗算を行うには、ローカルメモリを使用して、ブロックごとに行列をロードすることをお勧めします。AMDの場合は、低レイテンシのテクスチャキャッシュに依存して、行列要素を次のように読み取ることをお勧めします。必要です。 しかし、これはすでにかなり微妙な最適化であり、GPUに基本的に転送されているアルゴリズムの場合です。

この違いは、3Dテクスチャを使用する場合にも現れます。 AMDにとって深刻な利点を示した最初のGPUコンピューティングベンチマークの1つは、3次元データアレイで機能するため、3Dテクスチャを使用しただけです。 また、Radeonのテクスチャアクセスレイテンシは大幅に高速化され、3Dケースはハードウェアでさらに最適化されています。

さまざまな企業のハードウェアから最大のパフォーマンスを得るには、特定のカード用にアプリケーションを調整する必要がありますが、原則として、GPUアーキテクチャのアルゴリズムの開発よりも桁違いに重要ではありません。

Radeon47xxシリーズの制限

このファミリでは、GPUコンピューティングのサポートは不完全です。 3つの重要な点に注意することができます。 まず、ローカルメモリはありません。つまり、物理的には存在しますが、GPUプログラムの最新の標準で必要とされるユニバーサルアクセスがありません。 プログラムでグローバルメモリにエミュレートされます。つまり、フル機能のGPUとは対照的に、使用してもメリットはありません。 2つ目のポイントは、さまざまなアトミックメモリ操作命令と同期命令のサポートが制限されていることです。 そして3番目のポイントは、命令キャッシュのサイズがかなり小さいことです。特定のプログラムサイズから開始すると、速度が数倍遅くなります。 他にも小さな制限があります。 このビデオカードでは、GPUに最適なプログラムのみが適切に機能すると言えます。 ビデオカードは、レジスタのみで動作する単純なテストプログラムでギガフロップスで良好な結果を示すことができますが、複雑なものを効果的にプログラムすることには問題があります。

エバーグリーンの長所と短所

AMD製品とNvidia製品を比較すると、GPUコンピューティングの観点から、5xxxシリーズは非常に強力なGT200のように見えます。 非常に強力なので、ピークパフォーマンスでフェルミを約2.5倍上回ります。 特に、新しいNvidiaビデオカードのパラメータが削減された後、コアの数が削減されました。 ただし、FermiでのL2キャッシュの出現により、GPUでの一部のアルゴリズムの実装が簡素化され、GPUの範囲が拡大します。 興味深いことに、前世代のGT200 CUDAプログラムに最適化されているため、Fermiのアーキテクチャの革新はしばしば何もしませんでした。 それらは、コンピューティングモジュールの数の増加に比例して加速しました。つまり、メモリ帯域幅が増加しなかったため(または他の理由で)、2倍未満(単精度数の場合)、またはそれ以下でした。

また、GPUアーキテクチャにうまく適合し、ベクトルの性質がはっきりしているタスク(行列の乗算など)では、Radeonは理論上のピークに比較的近いパフォーマンスを示し、Fermiを追い越します。 マルチコアCPUは言うまでもありません。 特に単精度数の問題で。

しかし、Radeonのダイ面積は小さく、熱放散、消費電力、歩留まりが高く、したがってコストも低くなります。 そして、3Dグラフィックスの問題に直接、フェルミゲインは、もしあれば、水晶の面積の違いよりもはるかに小さいです。 これは主に、ミニプロセッサあたり16の計算ユニット、64スレッドの波面、およびVLIWベクトル命令を備えたRadeonの計算アーキテクチャが、その主要なタスクであるグラフィックシェーダーの計算に最適であるという事実によるものです。 通常のユーザーの大多数にとって、ゲームのパフォーマンスと価格が優先されます。

専門的で科学的なプログラムの観点から、Radeonアーキテクチャは、最高の価格性能比、ワットあたりのパフォーマンス、および原則としてGPUアーキテクチャに適合し、並列化とベクトル化を可能にするタスクの絶対パフォーマンスを提供します。

たとえば、完全に並列で簡単にベクトル化できるキー選択の問題では、RadeonはGeforceの数倍、CPUの数十倍高速です。

これは一般的なAMDFusionの概念に対応しており、GPUはCPUを補完し、数学コプロセッサーが以前に別のチップからプロセッサーコアに転送されたのと同じように、将来的にはCPUコア自体に統合されます(これは20回発生しました)。数年前、最初の登場前 Pentiumプロセッサ)。 GPUは、ストリーミングタスク用の統合グラフィックコアおよびベクトルコプロセッサーになります。

Radeonは、汎用モジュールによって実行されるときに、さまざまな波面からの命令を混合するというトリッキーな手法を使用します。 命令は完全に独立しているため、これは簡単に実行できます。 原理は、最新のCPUによる独立した命令のパイプライン実行に似ています。 どうやら、これにより、複雑なマルチバイトのベクトルVLIW命令を効率的に実行できるようになります。 CPUでは、これには、独立した命令を識別するための高度なスケジューラー、または異なるスレッドからの既知の独立した命令をCPUに提供するハイパースレッディングテクノロジーの使用が必要です。

0を測定バー1メジャー2対策3バー4メジャー5バー6メジャー7VLIWモジュール
波面0波面1波面0波面1波面0波面1波面0波面1
命令 0命令 0命令 16命令 16命令 32命令 32命令 48命令 48VLIW0
命令 一VLIW1
命令 2VLIW2
命令 3VLIW3
命令 4VLIW4
命令 五VLIW5
命令 6VLIW6
命令 7VLIW7
命令 8VLIW8
命令 九VLIW9
命令 10VLIW10
命令 十一VLIW11
命令 12VLIW12
命令 13VLIW13
命令 14VLIW14
命令 15VLIW15

それぞれ64の操作で構成される2つの波面の128の命令は、8サイクルで16のVLIWモジュールによって実行されます。 交代があり、2番目のサイクルで新しいモジュールの実行を並行して開始する場合、各モジュールには実際には命令全体を実行するための2つのサイクルがあります。 これはおそらく、a1×a2+b1×b2+c1×c2+d1×d2のようなVLIW命令をすばやく実行するのに役立ちます。つまり、8サイクルで8つのそのような命令を実行します。 (正式には、クロックごとに1つであることがわかります。)

Nvidiaには明らかにこのテクノロジーがありません。 また、VLIWがない場合、スカラー命令を使用した高性能には 高周波仕事は、自動的に熱放散を増加させ、技術的プロセスに高い要求を課します(回路をより高い周波数で動作させるため)。

GPUコンピューティングに関するRadeonの欠点は、分岐が非常に嫌いなことです。 GPUは通常、命令を実行するための上記のテクノロジーのために分岐を好みません。1つのプログラムアドレスを持つスレッドのグループによってすぐに実行されます。 (ちなみに、この手法はSIMT:単一命令-複数のスレッド(1つの命令-多数のスレッド)と呼ばれ、SIMDと同様に、1つの命令が異なるデータで1つの操作を実行します。) プログラムが完全にベクトルでない場合、ワープまたは波面のサイズが大きいほど悪化することは明らかです。隣接するスレッドのプログラムを通るパスが分岐すると、より多くのグループが形成され、順次実行する必要があるためです(シリアル化) )。 すべてのスレッドが分散しているとしましょう。ワープサイズが32スレッドの場合、プログラムの実行速度は32倍遅くなります。 また、サイズ64の場合、Radeonのように、64倍遅くなります。

これは目立ちますが、「嫌い」の唯一の兆候ではありません。 Nvidiaビデオカードでは、CUDAコアとも呼ばれる各機能モジュールには、特別なブランチ処理ユニットがあります。 また、16個のコンピューティングモジュール用のRadeonビデオカードには、2つの分岐制御ユニットしかありません(これらは算術ユニットのドメインから派生しています)。 したがって、条件付き分岐命令の単純な処理でさ​​え、その結果が波面のすべてのスレッドで同じであっても、追加の時間がかかります。 そして、速度が低下します。

AMDはCPUも製造しています。 彼らは、多くのブランチを持つプログラムには、CPUがさらに適していると信じており、GPUは純粋にベクタープログラムを対象としています。

そのため、Radeonは全体的に効率の悪いプログラミングを提供しますが、多くの場合、価格とパフォーマンスの比率は高くなります。 言い換えると、Fermiで効果的に実行できるプログラムよりも、CPUからRadeonに効率的に(有益に)移行できるプログラムの数が少なくなります。 しかし一方で、効果的に転送できるものは、多くの点でRadeonでより効率的に機能します。

GPUコンピューティング用のAPI

GPUコンピューティングを理想化して絶対化する必要はありませんが、Radeon自体の技術仕様は魅力的に見えます。 しかし、パフォーマンスにとっても同様に重要です ソフトウェア GPUプログラムの開発と実行に必要-言語からのコンパイラ 上級ランタイム、つまり、CPUで実行されているプログラムの一部とGPU自体の間で相互作用するドライバー。 CPUの場合よりもさらに重要です。CPUはデータ転送を管理するためのドライバーを必要とせず、コンパイラーの観点からは、GPUはより扱いにくいです。 たとえば、コンパイラは、計算の中間結果を格納するために最小数のレジスタを処理し、最小数のレジスタを使用して関数呼び出しを慎重にインライン化する必要があります。 結局のところ、スレッドが使用するレジスタが少なければ少ないほど、実行できるスレッドが多くなり、GPUをより完全にロードできるため、メモリアクセス時間をより適切に隠すことができます。

そのため、Radeon製品のソフトウェアサポートは、ハードウェアの開発にまだ遅れをとっています。 (ハードウェアのリリースが遅れ、製品が簡素化された形でリリースされたNvidiaの状況とは対照的です。)最近、AMDのOpenCLコンパイラーはベータ版であり、多くの欠陥がありました。 誤ったコードを生成したり、正しいソースコードからコードをコンパイルすることを拒否したり、それ自体でエラーが発生してクラッシュしたりすることがよくありました。 春の終わりになって初めて、高性能のリリースが行われました。 また、エラーがないわけではありませんが、エラーの数は大幅に少なく、原則として、正しさの危機に瀕している何かをプログラムしようとすると、傍観者になります。 たとえば、4バイトの4コンポーネント変数を指定するuchar4タイプで動作します。 このタイプはOpenCL仕様に含まれていますが、レジスタが128ビットであるためRadeonで使用する価値はありません。同じ4つのコンポーネントですが、32ビットです。 そして、そのようなuchar4変数は依然としてレジスタ全体を占有し、個々のバイトコンポーネントをパックしてアクセスする追加の操作のみが必要になります。 コンパイラにバグはないはずですが、バグのないコンパイラはありません。 11バージョン以降のIntelコンパイラでもコンパイルエラーが発生します。 識別されたバグは次のリリースで修正され、秋にリリースされる予定です。

しかし、まだ改善が必要なことがたくさんあります。 たとえば、これまで、Radeonの標準GPUドライバーはOpenCLを使用したGPUコンピューティングをサポートしていません。 ユーザーは、追加の特別なパッケージをダウンロードしてインストールする必要があります。

しかし、最も重要なことは、関数のライブラリがないことです。 倍精度の実数の場合、正弦、余弦、指数すらありません。 まあ、これは行列の加算/乗算には必要ありませんが、もっと複雑なものをプログラムしたい場合は、すべての関数を最初から作成する必要があります。 または、新しいSDKのリリースを待ちます。 基本的な行列関数をサポートするEvergreenGPUファミリ用のACML(AMD Core Math Library)は、まもなくリリースされる予定です。

現時点では、記事の作成者によると、Direct Compute 5.0 APIの使用は、Radeonビデオカードのプログラミングには現実的であるように思われます。当然、制限を考慮に入れています。 Windowsプラットフォーム 7およびWindowsVista。 マイクロソフトはコンパイラの作成に多くの経験があり、すぐに完全に機能するリリースを期待できます。マイクロソフトはこれに直接関心を持っています。 しかし、Direct Computeは、インタラクティブなアプリケーションのニーズに焦点を合わせています。たとえば、何かを計算してすぐに結果を視覚化することです。たとえば、表面上の液体の流れなどです。 これは、単に計算に使用できないという意味ではありませんが、これは本来の目的ではありません。 たとえば、MicrosoftはDirectComputeにライブラリ関数を追加する予定はありません。AMDには現在ないものです。 つまり、Radeonで効果的に計算できるもの(あまり洗練されていないプログラムもあります)は、OpenCLよりもはるかに単純で安定しているDirectComputeにも実装できます。 さらに、完全に移植可能であり、NvidiaとAMDの両方で実行されるため、プログラムをコンパイルする必要があるのは1回だけですが、NvidiaとAMDのOpenCLSDK実装は完全に互換性がありません。 (AMD OpenCL SDKを使用してAMDシステムでOpenCLプログラムを開発する場合、Nvidiaでは簡単に実行できない可能性があります。NvidiaSDKを使用して同じテキストをコンパイルする必要がある場合があります。もちろんその逆も同様です。 )。

次に、OpenCLは、幅広いシステム向けのユニバーサルプログラミング言語およびAPIとなることを目的としているため、OpenCLには多くの冗長機能があります。 そしてGPU、そしてCPU、そしてセル。 したがって、一般的なユーザーシステム(プロセッサとビデオカード)用のプログラムを作成したいだけの場合、OpenCLは、いわば「生産性が高い」とは思えません。 各関数には10個のパラメーターがあり、そのうちの9個を0に設定する必要があります。また、各パラメーターを設定するには、パラメーターもある特別な関数を呼び出す必要があります。

また、Direct Computeの現在の最も重要な利点は、ユーザーが特別なパッケージをインストールする必要がないことです。必要なものはすべてDirectX11に既に含まれています。

GPUコンピューティングの開発の問題

パーソナルコンピュータの分野を考えると、状況は次のようになります。多くの計算能力を必要とし、従来のデュアルコアプロセッサには深刻な不足があるタスクは多くありません。 まるで大きなごみのようでしたが、不器用な怪物が海から陸に這い出ており、陸で食べるものはほとんどありませんでした。 そして、地球の表面の原始的な住居は、天然資源が不足しているときにいつも起こるように、サイズが小さくなり、消費量が少なくなることを学んでいます。 今日、10〜15年前と同じパフォーマンスの必要性があったとしたら、GPUコンピューティングは大成功で受け入れられるでしょう。 そのため、互換性の問題とGPUプログラミングの相対的な複雑さが浮き彫りになります。 高速で実行されるがGPUでのみ実行されるプログラムよりも、すべてのシステムで実行されるプログラムを作成することをお勧めします。

GPUの見通しは、パフォーマンスに対する需要が高まっているため、プロフェッショナルアプリケーションおよびワークステーションセクターでの使用に関していくらか良くなっています。 GPU対応の3Dエディター用のプラグインが登場しています。たとえば、レイトレーシングを使用したレンダリング用です。通常のGPUレンダリングと混同しないでください。 複雑な効果をより速く作成することで、2Dおよびプレゼンテーションエディターにも何かが現れています。 ビデオ処理プログラムも徐々にGPUのサポートを獲得しています。 上記のタスクは、並列性の観点から、GPUアーキテクチャにうまく適合しますが、非常に大きなコードベースが作成、デバッグ、すべてのCPU機能に対して最適化されているため、適切なGPU実装が表示されるまでには時間がかかります。

このセグメントでは、限られた量のビデオメモリ(従来のGPUでは約1 GB)など、GPUのこのような弱点も明らかになります。 GPUプログラムのパフォーマンスを低下させる主な要因の1つは、低速バスを介してCPUとGPUの間でデータを交換する必要があることです。また、メモリの量が限られているため、より多くのデータを転送する必要があります。 そしてここで、GPUとCPUを1つのモジュールに組み合わせるというAMDの概念は有望に見えます。グラフィックスメモリの高帯域幅を犠牲にして、共有メモリへの簡単でシンプルなアクセスを実現し、さらに低レイテンシを実現できます。 現在のDDR5ビデオメモリのこの高帯域幅は、ほとんどのGPUコンピューティングプログラムよりもグラフィックプログラムによって直接要求されます。 一般に、GPUとCPUの共通メモリは、GPUの範囲を大幅に拡大し、プログラムの小さなサブタスクでそのコンピューティング機能を使用できるようにします。

そして、すべてのGPUのほとんどは、科学計算の分野で需要があります。 いくつかのGPUベースのスーパーコンピューターがすでに構築されており、マトリックス操作のテストで非常に高い結果を示しています。 科学的な問題は非常に多様で多数あるため、GPUアーキテクチャに完全に適合するセットが常に存在し、GPUを使用すると簡単に高性能を得ることができます。

すべてのタスクの中で 現代のコンピューターいずれかを選択してください。それはコンピュータグラフィックスになります。これは、私たちが住んでいる世界のイメージです。 そして、この目的に最適なアーキテクチャは悪いことではありません。 これは非常に重要で基本的なタスクであるため、そのために特別に設計されたハードウェアはユニバーサルであり、さまざまなタスクに最適である必要があります。 さらに、ビデオカードは順調に進化しています。

最近の最も隠された機能の1つ WindowsUpdate 10は、どのアプリケーションがグラフィックスプロセッシングユニット(GPU)を使用しているかを確認する機能です。 タスクマネージャを開いたことがあれば、CPU使用率を調べて、CPUを最も集中的に使用しているアプリケーションを確認したことがあるでしょう。 の 最新の更新同様の機能を追加しましたが、GPUGPU用です。 サードパーティのソフトウェアをダウンロードしなくても、ソフトウェアとゲームがGPUにどれほど集中しているかを理解するのに役立ちます。 CPUをGPUにオフロードするのに役立つもう1つの興味深い機能があります。 選び方を読むことをお勧めします。

タスクマネージャーにGPUがないのはなぜですか?

残念ながら、すべてのグラフィックカードがGPUを読み取るために必要な統計をWindowsに提供できるわけではありません。 確かに、DirectX診断ツールを使用してこのテクノロジをすばやくテストできます。

  1. クリック " 始める"そして検索で書く dxdiag DirectX診断ツールを実行します。
  2. タブに移動" 画面"、列の右側 運転手「あなたは持っているべきです WDDMモデルタスクマネージャーでGPUグラフを使用するための2.0以降のバージョン。

タスクマネージャーでGPUグラフを有効にする

各アプリケーションのGPU使用量を確認するには、タスクマネージャーを開く必要があります。

  • ボタンの組み合わせを押す Ctrl + Shift + Escタスクマネージャを開きます。
  • 空のフィールドでタスクマネージャを右クリックします" 名前"ドロップダウンメニューから確認してください GPU。また、注意することができます GPUコアどのプログラムがそれを使用しているかを確認します。
  • タスクマネージャーで、GPUグラフとGPUコアが右側に表示されます。


全体的なGPUパフォーマンスを表示する

GPUの全体的な使用状況を監視して、高負荷の下で監視および分析できます。 この場合、あなたはあなたが必要とするすべてを「 パフォーマンス"を選択して グラフィックプロセッサ。


各GPU要素は個々のグラフに分割されており、GPUがどのように使用されているかをさらに詳しく知ることができます。 表示されるグラフを変更する場合は、各タスクのタイトルの横にある小さな矢印をクリックできます。 この画面には、ドライバーのバージョンと日付も表示されます。これは、DXDiagまたはデバイスマネージャーを使用する代わりに使用できます。


今日、一般的なコンピューティングにGPUを使用することについてのニュースは、隅々まで聞かれます。 CUDA、Stream、OpenCLなどの単語は、わずか2年でITインターネット上で最も引用されている単語になりました。 しかし、これらの言葉が何を意味するのか、そしてその背後にある技術が何であるのかは、誰にも知られていません。 そして、「飛行中」に慣れているLinuxoidにとって、一般的に、これはすべて暗い森と見なされます。

GPGPUの誕生

私たちは皆、注文されたコードを実行できるコンピューターの唯一のコンポーネントは中央処理装置であると考えることに慣れています。 長い間、ほとんどすべての主流のPCには、オペレーティングシステムのコード、すべてのソフトウェア、ウイルスなど、考えられるすべての計算を処理する単一のプロセッサが搭載されていました。

その後、マルチコアプロセッサとマルチプロセッサシステムが登場し、そのようなコンポーネントがいくつかありました。 これにより、マシンは同時に複数のタスクを実行でき、システムの全体的な(理論上の)パフォーマンスは、マシンにインストールされているコアの数とまったく同じくらい向上しました。 しかし、マルチコアプロセッサの製造と設計は非常に困難で費用がかかることが判明しました。

各コアは、独自の(かなり大きな)キャッシュ、命令パイプライン、SSEブロック、最適化を実行する多くのブロックなどを備えた、複雑で複雑なx86アーキテクチャの本格的なプロセッサをホストする必要がありました。 等 したがって、コアの数を増やすプロセスは大幅に遅くなり、2つまたは4つのコアでは明らかに不十分であった白い大学のコートは、科学計算に他の計算能力を使用する方法を見つけました。ビデオカード(その結果、BrookGPUツールでさえも登場し、エミュレートしました 追加のプロセッサ DirectXおよびOpenGL関数呼び出しを使用)。

中央処理装置の多くの欠点がないGPUは、優れた非常に高速な計算機であることが判明し、すぐにGPUメーカー自身が科学者の発達を注意深く観察し始めました(そしてnVidiaはほとんどの研究者を採用しました全般的)。 その結果がnVidiaのCUDAテクノロジーであり、複雑なアルゴリズムの計算を松葉杖なしでGPUの肩に転送できるようにするインターフェイスを定義します。 その後、Close to Metal(現在はStream)と呼ばれる独自のテクノロジーのバリエーションを備えたATi(AMD)が続き、その後まもなく、OpenCLと呼ばれるAppleの標準バージョンが登場しました。

GPUが私たちのすべてですか?

すべての利点にもかかわらず、GPGPU技術にはいくつかの問題があります。 これらの最初のものは非常に狭い範囲にあります。 GPUは、コンピューティング能力とコアの総数の増加という点で中央処理装置よりもはるかに進んでいます(ビデオカードは、100を超えるコアで構成されるコンピューティングユニットを搭載しています)が、チップ自体のデザイン。

本質的に、GPUの主なタスクは、入力としてそれほど大量の予測可能なデータを受け取らない単純なアルゴリズムを使用した数学的計算に還元されます。 このため、GPUコアは非常にシンプルな設計、わずかなキャッシュボリューム、および適度な命令セットを備えており、最終的には製造コストが低く、チップ上に非常に高密度に配置できる可能性があります。 GPUは、何千人もの労働者を抱える中国の工場のようなものです。 彼らはいくつかの簡単なことを非常にうまくやっています(そして最も重要なのは-迅速かつ安価に)が、航空機の組み立てを彼らに任せれば、結果は最大のハンググライダーになります。

したがって、GPUの最初の制限は、高速の数学的計算に焦点を当てることです。これにより、マルチメディアアプリケーションや、複雑なデータ処理に関連するプログラム(アーカイバーや暗号化システムなど、また、蛍光顕微鏡、分子ダイナミクス、静電学、およびLinuxユーザーにはほとんど関心のないその他のものに関連するソフトウェアも含まれます。

GPGPUの2番目の問題は、すべてのアルゴリズムをGPUで実行できるとは限らないことです。 個々のGPUコアは非常に低速であり、それらのパワーは、それらが連携して機能する場合にのみ機能します。 そしてこれは、プログラマーが効果的に並列化できるのと同じくらい効率的なアルゴリズムになることを意味します。 ほとんどの場合、そのような仕事に対処できるのは優秀な数学者だけであり、ソフトウェア開発者の中にはごくわずかです。

そして第3に、GPUはビデオカード自体にインストールされたメモリで動作するため、GPUがアクティブ化されるたびに、2つの追加のコピー操作が発生します。 ランダム・アクセス・メモリアプリケーション自体とGRAMからの出力をアプリケーションメモリに戻します。 これにより、アプリケーション時間の増加が無効になる可能性があることを推測するのは難しいことではありません(FlacCLツールで発生します。これについては後で説明します)。

しかし、それだけではありません。 OpenCLに直面して一般的に受け入れられている標準が存在するにもかかわらず、多くのプログラマーは依然としてGPGPU技術のベンダー固有の実装を使用することを好みます。 CUDAは特に人気があり、より柔軟なプログラミングインターフェイスを提供しますが(ちなみに、nVidiaドライバーのOpenCLはCUDAの上に実装されています)、アプリケーションを1つのメーカーのビデオカードに緊密に結び付けています。

GPUによって高速化されたKGPUまたはLinuxカーネル

ユタ大学の研究者は、Linuxカーネルの一部の機能をCUDAフレームワークを使用してGPUで実行できるようにするKGPUシステムを開発しました。 このタスクを実行するために、変更されたLinuxカーネルと、ユーザースペースで実行され、カーネルリクエストをリッスンし、CUDAライブラリを使用してビデオカードドライバーに渡す特別なデーモンが使用されます。 興味深いことに、このようなアーキテクチャによって生じる大きなオーバーヘッドにもかかわらず、KGPUの作成者は、暗号化速度を上げるAESアルゴリズムの実装を作成することができました。 ファイルシステム eCryptfsを6回。

今は何ですか?

その若さのために、そしてまた上記の問題のために、GPGPUは真に普及した技術にはなりませんでした、しかし、その機能を使用する有用なソフトウェアは存在します(わずかではありますが)。 さまざまなハッシュのクラッカーが最初に登場しましたが、そのアルゴリズムは非常に簡単に並列化できます。

トランスコードを可能にするFlacCLエンコーダーなどのマルチメディアアプリケーションも誕生しました オーディオトラック FLAC形式に。 一部の既存のアプリケーションもGPGPUのサポートを取得しており、その中で最も注目すべきものはImageMagickでした。これは、OpenCLを使用して作業の一部をグラフィックプロセッサにシフトする方法を知っています。 データアーカイバやその他の情報圧縮システムをCUDA/OpenCLに転送するプロジェクトもあります(ATi Unixoidは好きではありません)。 この記事の次のセクションでは、これらのプロジェクトの中で最も興味深いものを検討しますが、今のところ、これらすべてを開始して安定して動作させるために必要なものを理解しようとします。

GPUは、パフォーマンスにおいてx86プロセッサを長い間上回っています

・次に、システムにビデオカード用の最新のプロプライエタリドライバがインストールされている必要があります。これらのドライバは、カードのネイティブGPGPUテクノロジとオープンOpenCLの両方をサポートします。

・そして第3に、ディストリビューションビルダーはGPGPUをサポートするアプリケーションパッケージの配布をまだ開始していないため、自分でアプリケーションをビルドする必要があります。そのためには、メーカーの公式SDK(CUDAToolkitまたはATIStream SDK)が必要です。 これらには、アプリケーションの構築に必要なヘッダーファイルとライブラリが含まれています。

CUDAツールキットをインストールする

上記のリンクをたどり、Linux用のCUDA Toolkitをダウンロードします(Fedora、RHEL、Ubuntu、およびSUSEディストリビューションの場合、x86とx86_64の両方のアーキテクチャーのバージョンがあります)。 さらに、開発者向けのドライバーキットをダウンロードする必要があります(Linux用の開発者ドライバー。リストの最初にあります)。

SDKインストーラーを実行します。

$ sudo sh cudatoolkit_4.0.17_linux_64_ubuntu10.10.run

インストールが完了したら、ドライバのインストールに進みます。 これを行うには、Xサーバーをシャットダウンします。

#sudo /etc/init.d/gdm stop

コンソールを開く ドライバーインストーラーを実行します。

$ sudo sh devdriver_4.0_linux_64_270.41.19.run

インストールが完了したら、Xを起動します。

アプリケーションがCUDA/OpenCLで動作するように、LD_LIBRARY_PATH変数にCUDAライブラリを含むディレクトリへのパスを書き込みます。

$ export LD_LIBRARY_PATH = / usr / local / cuda / lib64

または、32ビットバージョンをインストールした場合:

$ export LD_LIBRARY_PATH = / usr / local / cuda / lib32

また、コンパイラがアプリケーションのビルド段階でCUDAヘッダーファイルを見つけられるように、CUDAヘッダーファイルへのパスを指定する必要があります。

$ export C_INCLUDE_PATH = / usr / local / cuda / include

これで、CUDA/OpenCLソフトウェアの構築を開始できます。

ATIStreamSDKをインストールします

Stream SDKはインストールを必要としないため、AMD Webサイトからダウンロードしたアーカイブは、任意のディレクトリに簡単に解凍できます( 最善の選択/ opt)になり、同じLD_LIBRARY_PATH変数にパスを書き込みます。

$ wget http://goo.gl/CNCNo

$ sudo tar -xzf〜/ AMD-APP-SDK-v2.4-lnx64.tgz -C / opt

$ export LD_LIBRARY_PATH = / opt / AMD-APP-SDK-v2.4-lnx64 / lib / x86_64 /

$ export C_INCLUDE_PATH = / opt / AMD-APP-SDK-v2.4-lnx64 / include /

CUDA Toolkitと同様に、32ビットシステムではx86_64をx86に置き換える必要があります。 次に、ルートディレクトリに移動し、icd-registration.tgzアーカイブを解凍します(これは一種の無料です) ライセンスキー):

$ sudo tar -xzf /opt/AMD-APP-SDK-v2.4-lnx64/icd-registration.tgz-から /

clinfoツールを使用して、パッケージの正しいインストール/操作を確認します。

$ / opt / AMD-APP-SDK-v2.4-lnx64 / bin / x86_64 / clinfo

ImageMagickとOpenCL

OpenCLのサポートはずっと前にImageMagickに登場しましたが、どのディストリビューションでもデフォルトで有効になっていません。 したがって、ソースから自分でIMを構築する必要があります。 これについて複雑なことは何もありません。必要なものはすべてSDKにすでに含まれているため、アセンブリではnVidiaまたはAMDから追加のライブラリをインストールする必要はありません。 したがって、ソースを含むアーカイブをダウンロード/解凍します。

$ wget http://goo.gl/F6VYV

$ tar -xjf ImageMagick-6.7.0-0.tar.bz2

$ cd ImageMagick-6.7.0-0

$ sudo apt-get install build-essential

configuratorを実行し、OpenCLサポートのためにその出力を取得します。

$ LDFLAGS = -L $ LD_LIBRARY_PATH ./configure | grep -e cl.h -e OpenCL

コマンドの正しい出力は次のようになります。

CL/cl.hのユーザビリティをチェックしています...はい

CL/cl.hの存在を確認しています...はい

CL/cl.hをチェックしています...はい

OpenCL/cl.hのユーザビリティをチェックしています...いいえ

OpenCL/cl.hの存在を確認しています...いいえ

OpenCL/cl.hをチェックしています...いいえ

OpenCLライブラリをチェックしています...-lOpenCL

「はい」という単語は、最初の3行または2行目(あるいはその両方)をマークする必要があります。 そうでない場合は、C_INCLUDE_PATH変数が正しく初期化されていない可能性があります。 「no」という単語が最後の行を示している場合、問題はLD_LIBRARY_PATH変数にあります。 すべて問題がない場合は、ビルド/インストールプロセスを開始します。

$ sudo make install clean

ImageMagickが実際にOpenCLサポートでコンパイルされたことを確認します。

$ / usr / local / bin / convert-version | grepの機能

機能:OpenMP OpenCL

次に、結果として得られる速度の向上を測定しましょう。 ImageMagickの開発者は、これに畳み込みフィルターを使用することをお勧めします。

$ time /usr/bin/convert image.jpg -convolve "-1、-1、-1、-1、9、-1、-1、-1、-1" image2.jpg

$ time /usr/local/bin/convert image.jpg -convolve "-1、-1、-1、-1、9、-1、-1、-1、-1" image2.jpg

サイズ変更などの他の操作もはるかに高速に動作するはずですが、ImageMagickがグラフィックの処理を驚異的な速度で開始することを期待するべきではありません。 これまでのところ、OpenCLで最適化されているパッケージはほとんどありません。

FlacCL(フラクーダ)

FlacCLは、OpenCL機能を利用するFLACオーディオエンコーダーです。 これはWindows用のCUEToolsパッケージの一部ですが、monoのおかげで、Linuxでも使用できます。 エンコーダーでアーカイブを取得するには、次のコマンドを実行します。

$ mkdir flaccl && cd flaccl

$ wget www.cuetools.net/install/flaccl03.rar

$ sudo apt-get install unrar mono

$ unrar x fl accl03.rar

プログラムがOpenCLライブラリを見つけることができるように、シンボリックリンクを作成します。

$ ln -s $ LD_LIBRARY_PATH / libOpenCL.so libopencl.so

それでは、エンコーダーを起動しましょう。

$ mono CUETools.FLACCL.cmd.exe music.wav

画面に「エラー:要求されたコンパイルサイズが必要なワークグループサイズの32を超えています」というエラーメッセージが表示された場合は、システムにビデオカードがありません。関連するコアの数を、指定された数に減らす必要があります。フラグ'-group-sizeXX'を使用します。ここで、XXは必要なコア数です。

OpenCLの初期化時間が長いため、目立ったゲインは十分に長いトラックでのみ得られるとすぐに言わなければなりません。 FlacCLは、従来のバージョンとほぼ同じ速度で短いオーディオファイルを処理します。

oclHashcatまたはクイックブルートフォース

すでに述べたように、さまざまなクラッカーとパスワードブルートフォースシステムの開発者は、自社製品にGPGPUサポートを最初に追加した企業の1つです。 彼らのために 新技術は本当の聖杯になり、自然に簡単に並列化できるコードを高速GPUプロセッサの肩に簡単に転送できるようになりました。 したがって、そのようなプログラムの非常に異なる実装が数十あることは驚くべきことではありません。 しかし、この記事では、そのうちの1つであるoclHashcatについてのみ説明します。

oclHashcatは、OpenCLを使用してGPUパワーを使用しながら、非常に高速でハッシュによってパスワードを解読できるクラッカーです。 プロジェクトのWebサイトで公開されている測定値によると、nVidia GTX580でのMD5パスワード選択の速度は、1秒あたり最大1億5800万の組み合わせです。これにより、oclHashcatはわずか9分で平均的な複雑さの8文字のパスワードを見つけることができます。

このプログラムは、OpenCLおよびCUDA、MD5アルゴリズム、md5($pass。$salt)、md5(md5($ pass))、vBulletinをサポートしています。< v3.8.5, SHA1, sha1($pass.$salt), хэши MySQL, MD4, NTLM, Domain Cached Credentials, SHA256, поддерживает распределенный подбор паролей с задействованием мощности нескольких машин.

$ 7z x oclHashcat-0.25.7z

$ cdoclHashcat-0.25

そして、プログラムを実行します(ハッシュのトライアルリストとトライアル辞書を使用します):

$ ./oclHashcat64.bin example.hash?l?l?l?l example.dict

oclHashcatはテキストを開きます ユーザー規約、「YES」と入力して受け入れる必要があります。 その後、列挙プロセスが開始されます。進行状況は、を押すと確認できます。 。 プロセスを一時停止するには、を押します

再開します - 。 ブルートフォースを使用することもできます(たとえば、aaaaaaaaaからzzzzzzzまで)。

$ ./oclHashcat64.bin hash.txt?l?l?l?l?l?l?l?l

そして、辞書と直接列挙方法のさまざまな変更、およびそれらの組み合わせ(これについては、docs / examples.txtファイルで読むことができます)。 私の場合、辞書全体の列挙速度は11分でしたが、直接列挙(aaaaaaaaaからzzzzzzzzまで)は約40分続きました。 平均して、GPU(RV710チップ)の速度は8830万/秒でした。

結論

多くの異なる制限とソフトウェア開発の複雑さにもかかわらず、GPGPUは高性能デスクトップコンピューターの未来です。 しかし、最も重要なことは、このテクノロジーの機能を今すぐ使用できることです。これは、Windowsマシンだけでなく、Linuxにも当てはまります。


かつて私は、ラップトップを販売している多くの企業の1つであるテクニカルディレクターとコンピューター市場で話をする機会がありました。 この「スペシャリスト」は、私が必要とするラップトップの構成の種類を正確に説明するために、口の中で泡を立てようとしました。 彼の独り言の主なメッセージは、中央処理装置(CPU)の時代が終わり、現在すべてのアプリケーションがグラフィックス処理装置(GPU)の計算を積極的に使用しているため、ラップトップのパフォーマンスはグラフィックスに完全に依存しているということでした。プロセッサ、およびCPUに注意を払うことはできません。注意。 このテクニカルディレクターと議論して推論しようとすることは絶対に無意味であることに気づき、私は無駄に時間を無駄にせず、別のパビリオンで必要なラップトップを購入しました。 しかし、売り手のそのような露骨な無能さという事実そのものが私を襲った。 彼が私を買い手としてだまそうとしていたなら、それは理解できるでしょう。 全くない。 彼は自分の言ったことを心から信じていた。 はい、明らかに、NVIDIAとAMDのマーケターは無駄にパンを食べていません、そして彼らはまだ現代のコンピューターにおけるグラフィックプロセッサの支配的な役割のアイデアで何人かのユーザーを刺激することができました。

今日、グラフィックスプロセッシングユニット(GPU)コンピューティングがますます普及しているという事実は、疑いの余地がありません。 ただし、これによって中央処理装置の役割が損なわれることはありません。 さらに、ユーザーアプリケーションの大部分について話すと、今日、それらのパフォーマンスはCPUのパフォーマンスに完全に依存しています。 つまり、ユーザーアプリケーションの大部分はGPUコンピューティングを使用していません。

一般に、GPUコンピューティングは、主に科学計算専用のHPCシステムで実行されます。 しかし、GPUコンピューティングを使用するユーザーアプリケーションは、指で数えることができます。 同時に、この場合の「GPUでのコンピューティング」という用語は完全に正しいわけではなく、誤解を招く可能性があることにすぐに注意する必要があります。 実際のところ、アプリケーションがGPUコンピューティングを使用している場合、これは中央処理装置がアイドル状態であることをまったく意味しません。 GPUでのコンピューティングには、CPUからGPUへの負荷のシフトは含まれません。 原則として、中央処理装置はビジー状態のままであり、中央処理装置と一緒にグラフィックスプロセッサーを使用すると、パフォーマンスを向上させることができます。つまり、タスクの完了にかかる時間を短縮できます。 さらに、ここでのGPU自体はCPUの一種のコプロセッサーとして機能しますが、完全に置き換わるわけではありません。

GPUコンピューティングがそれほど万能薬ではない理由と、GPUコンピューティングがCPUのコンピューティング能力より優れていると言うのが間違っている理由を理解するには、中央処理装置とグラフィックプロセッサの違いを理解する必要があります。

GPUとCPUアーキテクチャの違い

CPUコアは、最大のパフォーマンスでシーケンシャル命令の単一ストリームを実行するように設計されていますが、GPUは非常に高速に実行されるように設計されています。 多数命令の並列スレッド。 これが、グラフィックプロセッサと中央プロセッサの根本的な違いです。 CPUは、整数と浮動小数点数の両方を処理する、高いシングルストリームパフォーマンス用に最適化された汎用または汎用プロセッサです。 この場合、データと命令を使用したメモリへのアクセスは主にランダムに発生します。

CPUのパフォーマンスを向上させるために、可能な限り多くの命令を並行して実行するように設計されています。 たとえば、この場合、プロセッサコアはアウトオブオーダー命令実行ブロックを使用します。これにより、命令を受信した順序から並べ替えることができ、命令の実装における並列性のレベルを上げることができます。シングルスレッドのレベルで。 それでもなお、これでは多数の命令を並列実行することはできず、プロセッサコア内で命令を並列化するためのオーバーヘッドは非常に重要であることがわかります。 そのため、汎用プロセッサには実行ユニットの数がそれほど多くありません。

GPUの設計は根本的に異なります。 もともとは、膨大な数のコマンドの並列ストリームを実行するように設計されていました。 さらに、これらのコマンドストリームは最初に並列化され、GPUで命令を並列化するためのオーバーヘッドはありません。 GPUは、画像をレンダリングするように設計されています。 簡単に言うと、入力ではポリゴンのグループを取り、必要なすべての操作を実行し、出力でピクセルを出力します。 ポリゴンとピクセルの処理は独立しており、互いに別々に並行して処理できます。 したがって、GPUでの作業の本質的な並列編成により、CPUの命令の順次フローとは対照的に、ロードが容易な多数の実行ユニットが使用されます。

GPUとCPUは、メモリへのアクセス方法も異なります。 GPUでは、メモリアクセスは簡単に予測できます。テクスチャテクセルがメモリから読み取られると、しばらくすると隣接するテクセルも同様に表示されます。 書き込むときも同じことが起こります。ピクセルがフレームバッファに書き込まれると、数サイクル後に、その隣にあるピクセルが書き込まれます。 したがって、GPUは、CPUとは異なり、単に大きなキャッシュを必要とせず、テクスチャは数キロバイトしか必要としません。 GPUとCPUでメモリを操作する原理も異なります。 したがって、最近のすべてのGPUには複数のメモリコントローラーがあり、グラフィックスメモリ自体が高速であるため、GPUにはさらに多くのメモリがあります。 だいたい汎用プロセッサと比較してより広いメモリ帯域幅。これは、巨大なデータストリームで動作する並列計算にとっても非常に重要です。

ユニバーサルプロセッサの場合b だいたいチップ領域のほとんどは、さまざまなコマンドおよびデータバッファ、デコードブロック、ハードウェア分岐予測ブロック、コマンド並べ替えブロック、および第1、第2、および第3レベルのキャッシュメモリによって占められています。 これらのハードウェアブロックはすべて、プロセッサコアレベルでの並列化により、いくつかの命令ストリームの実行を高速化するために必要です。

実行ユニット自体は、ユニバーサルプロセッサで比較的小さなスペースを占有します。

逆に、GPUでは、メインエリアが多数の実行ユニットで占められているため、数千のコマンドストリームを同時に処理できます。

最新のCPUとは異なり、GPUは多数の算術演算を伴う並列計算用に設計されていると言えます。

非グラフィックタスクにGPUの計算能力を使用することは可能ですが、解決される問題が、GPUで使用可能な数百の実行ユニットにアルゴリズムを並列化する可能性を考慮に入れている場合に限ります。 特に、GPUでの計算のパフォーマンスは、同じシーケンスの数学演算が大量のデータに適用された場合に優れた結果を示します。 この場合、メモリアクセスの数に対する算術命令の数の比率が十分に大きい場合に、最良の結果が得られます。 この操作は、実行制御への要求が少なく、大きなキャッシュを必要としません。

計算効率の点でCPUに対するGPUの利点が否定できない科学的計算の例はたくさんあります。 そのため、分子モデリング、ガスダイナミクス、流体ダイナミクスなどの多くの科学的アプリケーションは、GPU計算に完全に適合しています。

したがって、問題を解決するためのアルゴリズムを数千の個別のスレッドに並列化できる場合、GPUを使用してそのような問題を解決する効率は、汎用プロセッサのみを使用して解決するよりも高くなる可能性があります。 ただし、CPUとGPUが異なるコマンドを使用しているという理由だけで、CPUからGPUにいくつかのタスクのソリューションを取得して転送することはそれほど簡単ではありません。 つまり、CPU上のソリューション用にプログラムを作成する場合は、x86命令セット(または特定のプロセッサアーキテクチャと互換性のある命令セット)が使用されますが、GPUの場合は、まったく異なる命令セットが使用されます。そのアーキテクチャと機能を説明します。 最新の3Dゲーム開発では、DirectXおよびOrenGL APIを使用して、プログラマーがシェーダーとテクスチャを操作できるようにします。 ただし、GPUでの非グラフィックコンピューティングにDirectXおよびOrenGL APIを使用することは、最善のオプションではありません。

NVIDIACUDAおよびAMDAPP

そのため、GPU(汎用GPU、GPGPU)に非グラフィカルコンピューティングを実装する最初の試みが行われ始めたとき、BrookGPUコンパイラが登場しました。 開発者は、作成する前に、OpenGLまたはDirect3DグラフィックスAPIを介してビデオカードリソースにアクセスする必要がありました。これは、特定の知識が必要なため、プログラミングプロセスを非常に複雑にしました。3Dオブジェクト(シェーダー、テクスチャなど)の操作の原則を学ぶ必要がありました。 )。 これが、ソフトウェア製品でのGPGPUの使用が非常に限られている理由です。 BrookGPUは一種の「翻訳者」になりました。 これらのC言語のストリーミング拡張機能は、プログラマーから3D APIを隠し、それを使用する場合、3Dプログラミングの知識の必要性は事実上なくなりました。 ビデオカードの計算能力は、並列計算用の追加のコプロセッサーの形でプログラマーが利用できるようになりました。 BrookGPUコンパイラは、Cコードと拡張子を持つファイルを処理し、DirectXまたはOpenGLをサポートするライブラリにリンクされたコードを構築しました。

BrookGPUのおかげで、NVIDIAとATI(現在はAMD)は、GPU上の新しい汎用コンピューティングテクノロジーに注目し、3Dアクセラレータコンピューティングユニットへの直接かつより透過的なアクセスを提供する独自の実装の開発を開始しました。

その結果、NVIDIAはCUDA(Compute Unified Device Architecture)並列コンピューティングアーキテクチャを開発しました。 CUDAアーキテクチャにより、非グラフィカルコンピューティングをNVIDIAGPUに実装できます。

CUDASDKのパブリックベータバージョンは2007年2月にリリースされました。 CUDA APIは、C言語の簡略化された方言に基づいています。 CUDA SDKのアーキテクチャにより、プログラマーはNVIDIA GPUで実行され、Cプログラムコードに特別な関数を含めるアルゴリズムを実装できます。 この言語でコードを正常に翻訳するために、CUDASDKには独自のSycompilerが含まれています コマンドライン NVIDIAのnvcc。

CUDAはそのようなためのクロスプラットフォームソフトウェアです オペレーティングシステム Linux、Mac OS X、Windowsのように。

AMD(ATI)は、GPGPUテクノロジーの独自のバージョンも開発しました。以前はATI Streamと呼ばれていましたが、現在はAMD Accelerated Parallel Processing(APP)と呼ばれています。 AMD APPは、オープンな業界標準のOpenCL(Op​​en Computing Language)に基づいています。 OpenCL標準は、命令レベルとデータレベルで並列処理を提供し、GPGPU技術の実装です。 これは完全にオープンスタンダードであり、使用料は無料です。 ただし、AMDAPPとNVIDIACUDAは相互に互換性がないことに注意してください。 最新バージョン NVIDIACUDAはOpenCLもサポートしています。

ビデオコンバータでのGPGPUのテスト

そのため、CUDAテクノロジーはNVIDIA GPUにGPGPUを実装し、AMDGPUにAPPAPIを実装するように設計されていることがわかりました。 すでに述べたように、GPUで非グラフィック計算を使用することは、解決するタスクを多くのスレッドに並列化できる場合にのみお勧めします。 ただし、ほとんどのユーザーアプリケーションはこの基準を満たしていません。 ただし、いくつかの例外があります。 たとえば、最新のビデオコンバーターのほとんどは、NVIDIAおよびAMDGPUで計算を使用する機能をサポートしています。

カスタムビデオコンバーターでGPUコンピューティングがどの程度効率的に使用されているかを調べるために、Xilisoft Video Converter Ultimate 7.7.2、Wondershare Video Converter Ultimate 6.0.3.2、およびMovavi VideoConverter10.2.1の3つの一般的なソリューションを選択しました。 これらのコンバーターは、NVIDIAおよびAMDグラフィックプロセッサーの使用をサポートしており、ビデオコンバーターの設定でこの機能を無効にできます。これにより、GPUの使用効率を評価できます。

ビデオ変換には、3つの異なるビデオを使用しました。

最初のビデオは3分35秒の長さで、サイズは1.05GBでした。 mkvデータストレージ(コンテナ)形式で記録され、次の特徴がありました。

  • ビデオ:
    • フォーマット-MPEG4ビデオ(H264)、
    • 解像度-1920*um * 1080、
    • ビットレートモード-可変、
    • 平均ビデオビットレート-42.1Mbps、
    • 最大ビデオビットレート-59.1Mbps、
    • フレームレート-25fps;
  • オーディオ:
    • フォーマット-MPEG-1オーディオ、
    • オーディオビットレート-128Kbps、
    • チャネル数-2、

2番目のビデオの長さは4分25秒で、サイズは1.98GBでした。 MPGデータストレージ(コンテナ)形式で記録され、次の特徴がありました。

  • ビデオ:
    • フォーマット-MPEG-PS(MPEG2ビデオ)、
    • 解像度-1920*um * 1080、
    • ビットレートモード-可変。
    • 平均ビデオビットレート-62.5Mbps、
    • 最大ビデオビットレート-100Mbps、
    • フレームレート-25fps;
  • オーディオ:
    • フォーマット-MPEG-1オーディオ、
    • オーディオビットレート-384Kbps、
    • チャネル数-2、

3番目のビデオは3分47秒の長さで、サイズは197MBでした。 MOVデータストレージ(コンテナ)形式で記録され、次のような特徴がありました。

  • ビデオ:
    • フォーマット-MPEG4ビデオ(H264)、
    • 解像度-1920*um * 1080、
    • ビットレートモード-可変、
    • ビデオビットレート-7024Kbps、
    • フレームレート-25fps;
  • オーディオ:
    • フォーマット-AAC、
    • オーディオビットレート-256Kbps、
    • チャネル数-2、
    • サンプリング周波数-48kHz。

3つのテストビデオはすべて、ビデオコンバーターを使用してiPad 2タブレットで表示するためにMP4データストレージ形式(H.264コーデック)に変換されました。出力ビデオファイルの解像度は1280 * um*720でした。

3つのコンバーターすべてでまったく同じ変換設定を使用したわけではないことに注意してください。 そのため、ビデオコンバータの効率を変換時間で比較するのは正しくありません。 たとえば、Xilisoft Video Converter Ultimate 7.7.2ビデオコンバーターでは、iPad2プリセット-H.264HDビデオが変換に使用されました。 このプリセットは 以下の設定コーディング:

  • コーデック-MPEG4(H.264);
  • 解像度-1280*um * 720;
  • フレームレート-29.97fps;
  • ビデオビットレート-5210Kbps;
  • オーディオコーデック-AAC;
  • オーディオビットレート-128Kbps;
  • チャネル数-2;
  • サンプリング周波数-48kHz。

Wondershare Video Converter Ultimate 6.0.3.2は、次の追加設定でiPad2プリセットを使用しました。

  • コーデック-MPEG4(H.264);
  • 解像度-1280*um * 720;
  • フレームレート-30fps;
  • ビデオビットレート-5000Kbps;
  • オーディオコーデック-AAC;
  • オーディオビットレート-128Kbps;
  • チャネル数-2;
  • サンプリング周波数-48kHz。

Movavi Video Converter 10.2.1は、iPadプリセット(1280 * um * 720、H.264)(* .mp4)を次の追加設定で使用しました。

  • ビデオフォーマット-H.264;
  • 解像度-1280*um * 720;
  • フレームレート-30fps;
  • ビデオビットレート-2500Kbps;
  • オーディオコーデック-AAC;
  • オーディオビットレート-128Kbps;
  • チャネル数-2;
  • サンプリング周波数-44.1kHz。

各ソースビデオの変換は、GPUとCPUのみの両方を使用して、各ビデオコンバーターで5回実行されました。 変換するたびに、コンピューターが再起動しました。

その結果、各ビデオは各ビデオコンバーターで10回変換されました。 この日常業務を自動化するために書かれました 特別なユーティリティテストプロセスを完全に自動化できるグラフィカルインターフェイスを備えています。

テストベンチ構成

テストスタンドの構成は次のとおりです。

  • プロセッサー-IntelCorei7-3770K;
  • マザーボード-ギガバイトGA-Z77X-UD5H;
  • チップセット システムボード-Intel Z77 Express;
  • メモリ-DDR3-1600;
  • メモリサイズ-8GB(2つの4 GB GEILモジュール);
  • メモリ動作モード-デュアルチャネル;
  • グラフィックカード-NVIDIA GeForce GTX 660Ti(ビデオドライバー314.07);
  • ドライブ-IntelSSD520(240GB)。

オペレーティングシステムWindows7Ultimate(64ビット)がスタンドにインストールされました。

最初に、プロセッサとシステムの他のすべてのコンポーネントを通常の動作でテストしました。 同時に、IntelCorei7-3770Kプロセッサは3.5GHzcの公称周波数で動作しました。 起動モード ターボブースト(ターボブーストモードのプロセッサの最大周波数は3.9 GHzです)。

次に、テストプロセスを繰り返しましたが、プロセッサを4.5 GHzの固定周波数にオーバークロックしながら(ターボブーストモードを使用せずに)。 これにより、変換速度のプロセッサ(CPU)の周波数への依存性を明らかにすることができました。

テストの次の段階で、標準のプロセッサ設定に戻り、他のビデオカードでテストを繰り返しました。

  • NVIDIA GeForce GTX 280(ドライバー314.07);
  • NVIDIA GeForce GTX 460(ドライバー314.07);
  • AMD Radeon HD6850(ドライバー13.1)。

したがって、ビデオ変換は、異なるアーキテクチャの4枚のビデオカードで実行されました。

古いビデオカードNVIDIAGeForce660Tiは、28 nmプロセステクノロジを使用して製造された、コード指定GK104(Keplerアーキテクチャ)の同じ名前のグラフィックプロセッサに基づいています。 このGPUには、35.4億個のトランジスタと、294mm2のダイ領域が含まれています。

GK104 GPUには4つのグラフィックス処理クラスター(グラフィックス処理クラスター、GPC)が含まれていることを思い出してください。 GPCクラスターは、プロセッサー内の独立したデバイスであり、ラスターライザー、ジオメトリエンジン、テクスチャモジュールなど、必要なすべてのリソースを備えているため、個別のデバイスとして機能できます。

このような各クラスターには2つのストリーミングマルチプロセッサー(SMX)がありますが、クラスターの1つにあるGK104プロセッサーでは、1つのマルチプロセッサーがブロックされるため、合計7つのSMXマルチプロセッサーがあります。

各SMXストリーミングマルチプロセッサには192個のストリームコンピューティングコア(CUDAコア)が含まれているため、GK104プロセッサには合計1344個のCUDAコアがあります。 さらに、各SMXマルチプロセッサには、16個のTMU、32個の特殊機能ユニット(SFU)、32個のロードストアユニット(LSU)、PolyMorphエンジンなどが含まれています。

GeForce GTX 460グラフィックカードは、Fermiアーキテクチャに基づくGF104というコードネームのGPUに基づいています。 このプロセッサは40nmプロセス技術を使用して製造されており、約19.5億個のトランジスタが含まれています。

GF104 GPUには、2つのGPCグラフィックス処理クラスターが含まれています。 それぞれに4つのストリーミングマルチプロセッサSMがありますが、クラスタの1つにあるGF104プロセッサでは、1つのマルチプロセッサがブロックされているため、7つのマルチプロセッサSMしかありません。

各SMストリーミングマルチプロセッサには48個のストリームコンピューティングコア(CUDAコア)が含まれているため、GK104プロセッサには合計336個のCUDAコアがあります。 さらに、各SMマルチプロセッサには、8つのテクスチャユニット(TMU)、8つの特殊機能ユニット(SFU)、16のロードストアユニット(LSU)、PolyMorphエンジンなどが含まれています。

GeForce GTX 280 GPUは、NVIDIAの統合GPUアーキテクチャの第2世代に属しており、FermiやKeplerとはアーキテクチャが大きく異なります。

GeForce GTX 280 GPUは、テクスチャ処理クラスター(TPC)で構成されています。これは、類似していますが、FermiおよびKeplerGPCグラフィックス処理クラスターとは大きく異なります。 合計で、GeForceGTX280プロセッサにはそのようなクラスターが10個あります。 各TPCクラスターには、3つのSMと8つのTMUが含まれます。 各マルチプロセッサは、8つのストリームプロセッサ(SP)で構成されています。 マルチプロセッサには、グラフィックスと一部の計算タスクの両方で使用されるテクスチャデータをサンプリングおよびフィルタリングするためのブロックも含まれています。

したがって、1つのTPCクラスターには24のストリームプロセッサーがあり、GeForce GTX280GPUにはすでに240のストリームプロセッサーがあります。

テストで使用されたNVIDIAGPUに基づくビデオカードの概要特性を表に示します。

上記の表にはAMDRadeonHD6850ビデオカードはありません。 技術仕様 NVIDIAグラフィックカードと比較するのは難しいです。 したがって、別途検討させていただきます。

コードネームBartsのAMDRadeonHD6850 GPUは、40 nmプロセスを使用して製造され、17億個のトランジスタを搭載しています。

AMD Radeon HD6850プロセッサアーキテクチャは、複数の種類のデータをストリーミングするための共通プロセッサのアレイを備えた統合アーキテクチャです。

AMD Radeon HD6850プロセッサは12個のSIMDコアで構成され、各コアには16個のスーパースカラーストリームプロセッサユニットと4個のテクスチャユニットが含まれています。 各スーパースカラーストリームプロセッサには、5つのユニバーサルストリームプロセッサが含まれています。 したがって、AMD Radeon HD6850 GPUには、合計で12 * um * 16 * um * 5=960のユニバーサルストリームプロセッサがあります。

AMD RadeonHD6850グラフィックカードのGPU周波数は775MHzであり、GDDR5メモリの有効周波数は4000MHzです。 メモリの量は1024MBです。

試験結果

それでは、テスト結果に目を向けましょう。 NVIDIA GeForce GTX 660Tiビデオカードを使用し、標準の動作モードである最初のテストから始めましょう Intelプロセッサ Corei7-3770K。

イチジクに 図1〜3は、GPUを使用するモードと使用しないモードで3つのコンバーターを使用して3つのテストビデオを変換した結果を示しています。

テスト結果からわかるように、GPUを使用した場合の効果は明ら​​かです。 Xilisoft Video Converter Ultimate 7.7.2の場合、GPUを使用すると、変換時間は1番目、2番目、3番目のビデオでそれぞれ14%、9%、19%短縮されます。

Wondershare Video Converter Ultimate 6.0.32の場合、GPUを使用すると、1番目、2番目、3番目のビデオの変換時間をそれぞれ10%、13%、23%短縮できます。

しかし、Movavi Video Converter 10.2.1は、GPUを使用することで最もメリットがあります。 1番目、2番目、3番目のビデオの場合、変換時間の短縮はそれぞれ64%、81%、41%です。

GPUを使用することによる利益は、元のビデオとビデオ変換設定の両方に依存することは明らかです。これは、実際、私たちの結果によって示されています。

次に、IntelCorei7-3770Kプロセッサを4.5GHzの周波数にオーバークロックした場合の変換時間の増加を見てみましょう。 通常モードですべてのプロセッサコアが変換中にロードされ、ターボブーストモードで3.7 GHzの周波数で動作すると仮定すると、周波数を4.5 GHzに上げると、22%のオーバークロックに相当します。

イチジクに 図4〜6は、GPUを使用するモードと使用しないモードでプロセッサをオーバークロックした場合の3つのテストビデオの変換結果を示しています。 この場合、グラフィックプロセッサを使用すると、変換時間を増やすことができます。

Xilisoft Video Converter Ultimate 7.7.2の場合、GPUを使用すると、変換時間は、1番目、2番目、および3番目のビデオでそれぞれ15%、9%、および20%短縮されます。

Wondershare Video Converter Ultimate 6.0.32の場合、GPUを使用すると、1番目、2番目、3番目のビデオの変換時間をそれぞれ10%、10%、20%短縮できます。

Movavi Video Converter 10.2.1の場合、GPUを使用すると、変換時間をそれぞれ59%、81%、40%短縮できます。

当然、プロセッサをオーバークロックすると、GPUがある場合とない場合の変換時間がどのように短縮されるかを確認するのは興味深いことです。

イチジクに 図7-9は、プロセッサの通常モードとオーバークロックモードでGPUを使用せずにビデオ変換時間を比較した結果を示しています。 この場合、変換はGPU計算なしでCPUによってのみ実行されるため、プロセッサのクロック周波数を上げると、変換時間の短縮(変換速度の増加)につながることは明らかです。 変換速度の低下は、すべてのテストビデオでほぼ同じである必要があることも同様に明らかです。 したがって、ビデオコンバーターXilisoft Video Converter Ultimate 7.7.2の場合、プロセッサーをオーバークロックすると、変換時間は1番目、2番目、3番目のビデオでそれぞれ9、11、9%短縮されます。 Wondershare Video Converter Ultimate 6.0.32の場合、変換時間は、1番目、2番目、3番目のビデオでそれぞれ9%、9%、10%短縮されます。 Movavi Video Converter 10.2.1ビデオコンバーターの場合、変換時間はそれぞれ13、12、12%短縮されます。

したがって、プロセッサが20%オーバークロックされると、変換時間は約10%短縮されます。

プロセッサの通常モードとオーバークロックモードでGPUを使用したビデオ変換時間を比較してみましょう(図10-12)。

ビデオコンバーターXilisoftVideoConverter Ultimate 7.7.2の場合、プロセッサーをオーバークロックすると、変換時間は1番目、2番目、3番目のビデオでそれぞれ10、10、9%短縮されます。 Wondershare Video Converter Ultimate 6.0.32の場合、変換時間は、1番目、2番目、3番目のビデオでそれぞれ9%、6%、5%短縮されます。 Movavi Video Converter 10.2.1ビデオコンバーターの場合、変換時間はそれぞれ0.2、10、10%短縮されます。

ご覧のとおり、Xilisoft Video ConverterUltimate7.7.2およびWondershareVideoConverter Ultimate 6.0.32コンバーターの場合、プロセッサーをオーバークロックするときの変換時間の短縮は、GPUを使用する場合と使用しない場合の両方でほぼ同じです。これは、これらのコンバーターが論理的であるためです。 GPUコンピューティングを非常に効率的に使用しないでください。 ただし、GPUコンピューティングを効率的に使用するMovavi Video Converter 10.2.1の場合、GPUコンピューティングモードでプロセッサをオーバークロックしても、変換時間の短縮にはほとんど影響しません。この場合、主な負荷がGPUにかかるため、これも理解できます。

次に、さまざまなビデオカードを使用したテスト結果を見てみましょう。

グラフィックプロセッサのビデオカードが強力で、CUDAコア(またはAMDビデオカードのユニバーサルストリームプロセッサ)が多いほど、グラフィックプロセッサを使用すると、ビデオ変換の効率が上がるはずです。 しかし実際には、そのようには機能しません。

NVIDIA GPUをベースにしたビデオカードの場合、状況は次のようになります。 Xilisoft Video ConverterUltimate7.7.2およびWondershareVideoConverter Ultimate 6.0.32を使用する場合、変換時間は実際には使用するビデオカードの種類に依存しません。 つまり、GPUコンピューティングモードのNVIDIA GeForce GTX 660Ti、NVIDIA GeForce GTX 460、およびNVIDIA GeForce GTX 280ビデオカードの場合、変換時間は同じです(図13-15)。

米。 1.最初の変換の結果
通常モードでビデオをテストする
プロセッサの仕事

GPU使用モードのプロセッサグラフィックカード

米。 14.2番目のビデオの変換時間を比較した結果

米。 15.3番目のビデオの変換時間を比較した結果
GPU使用モードのさまざまなグラフィックカード

これは、Xilisoft Video ConverterUltimate7.7.2およびWondershareVideoConverter Ultimate 6.0.32に実装されているGPU計算アルゴリズムが単に非効率的であり、すべてのグラフィックコアをアクティブに使用できるわけではないという事実によってのみ説明できます。 ちなみに、これは、これらのコンバーターの場合、GPUモードと非GPUモードでの変換時間の差が小さいという事実を説明しています。

Movavi Video Converter 10.2.1では、状況が多少異なります。 覚えているように、このコンバーターはGPU計算を非常に効率的に使用できるため、GPUモードでは、変換時間は使用するビデオカードの種類によって異なります。

しかし、 AMDグラフィックカード RadeonHD6850はすべて通常どおりです。 「曲線」のビデオカードドライバー、またはコンバーターに実装されたアルゴリズムのいずれかを大幅に改善する必要がありますが、GPU計算の場合、結果は改善または悪化しません。

具体的には、状況は以下のとおりです。 Xilisoft Video Converter Ultimate 7.7.2の場合、GPUを使用して最初のテストビデオを変換すると、変換時間は43%増加し、2番目のビデオは66%増加します。

さらに、Xilisoft Video ConverterUltimate7.7.2も不安定な結果を特徴としています。 コンバージョン時間の広がりは40%に達する可能性があります! そのため、すべてのテストを10回繰り返し、平均結果を計算しました。

ただし、Wondershare Video ConverterUltimate6.0.32およびMovaviVideoConverter 10.2.1の場合、GPUを使用して3つのビデオすべてを変換する場合、変換時間はまったく変わりません。 Wondershare Video ConverterUltimate6.0.32およびMovaviVideoConverter 10.2.1は、変換時にAMD APPテクノロジーを使用しないか、AMDビデオドライバーが単に「曲がっている」ため、AMDAPPテクノロジーが機能しない可能性があります。

結論

実行されたテストに基づいて、次の重要な結論を引き出すことができます。 最新のビデオコンバーターは確かにGPUコンピューティングテクノロジーを使用でき、変換速度を上げることができます。 ただし、これは、すべての計算が完全にGPUに転送され、CPUがアイドル状態のままであることを意味するものではありません。 テストが示すように、GPGPUテクノロジーを使用する場合、中央処理装置はロードされたままです。つまり、ビデオ変換に使用されるシステムでの強力なマルチコア中央処理装置の使用は引き続き適切です。 このルールの例外は、AMDGPU上のAMDAPPテクノロジーです。 たとえば、AMDAPPテクノロジをアクティブにしてXilisoftVideo Converter Ultimate 7.7.2を使用すると、CPU負荷は実際に減少しますが、これにより、変換時間は減少せず、逆に増加します。

一般に、グラフィックプロセッサを追加して使用するビデオ変換について説明する場合は、この問題を解決するために、NVIDIAグラフィックプロセッサを搭載したビデオカードを使用することをお勧めします。 実践が示すように、この場合にのみ、変換速度の向上を達成することが可能です。 また、変換速度の実際の向上は多くの要因に依存することを覚えておく必要があります。 これらは入力および出力ビデオフォーマットであり、もちろん、ビデオコンバータ自体です。 Xilisoft Video ConverterUltimate7.7.2およびWondershareVideoConverter Ultimate 6.0.32はこのタスクには適していませんが、コンバーターとMovavi VideoConverter10.2.1はNVIDIAGPUを非常に効果的に使用できます。

AMD GPUをベースにしたビデオカードについては、ビデオ変換タスクにはまったく使用しないでください。 最良の場合、これによって変換速度が向上することはなく、最悪の場合、変換速度が低下する可能性があります。

GPUコンピューティング

CUDA(Compute Unified Device Architecture)テクノロジーは、GPGPU(ビデオカードの任意のコンピューティング)テクノロジーをサポートするNVIDIAGPUを使用したコンピューティングを可能にするソフトウェアおよびハードウェアアーキテクチャです。 CUDAアーキテクチャは、第8世代のNVIDIAチップであるG80のリリースで最初に市場に登場し、GeForce、ION、Quadro、およびTeslaアクセラレータファミリで使用される後続のすべてのグラフィックスチップシリーズに存在します。

CUDA SDKを使用すると、プログラマーは、Cプログラミング言語の特別な簡略化された方言で、NVIDIA GPUで実行でき、Cプログラムテキストに特別な機能を含めることができるアルゴリズムを実装できます。 CUDAは、開発者が独自の裁量で、グラフィックアクセラレータの命令セットへのアクセスを整理し、そのメモリを管理し、複雑な並列コンピューティングを整理する機会を提供します。

歴史

2003年、IntelとAMDは、最も強力なプロセッサをめぐって共同競争を繰り広げました。 何年にもわたって、特にIntel Pentium 4のリリース後、このレースの結果としてクロック速度が大幅に上昇しました。

クロック周波数の増加後(2001年から2003年の間に、Pentium4のクロック周波数は1.5から3GHzに2倍になりました)、ユーザーは10分の1ギガヘルツに満足する必要がありました。周波数は3〜3.8 GHzに増加しました)。

Prescottなどの高クロック速度用に最適化されたアーキテクチャも、本番環境だけでなく、問題を経験し始めました。 チップメーカーは、物理法則を克服する上で課題に直面しています。 一部のアナリストは、ムーアの法則が機能しなくなるとさえ予測していました。 しかし、それは起こりませんでした。 法則の本来の意味はしばしば誤って伝えられますが、それはシリコンコアの表面上のトランジスタの数を指します。 長い間、CPU内のトランジスタ数の増加は、それに対応するパフォーマンスの向上を伴いました。これは、意味の歪みにつながりました。 しかし、その後、状況はより複雑になりました。 CPUアーキテクチャの設計者は、ゲイン削減の法則に取り組みました。パフォーマンスを向上させるために追加する必要のあるトランジスタの数が増え、行き止まりになりました。

GPUメーカーがこの問題に直面していない理由は非常に単純です。CPUは、さまざまなデータ(整数と浮動小数点数の両方)を処理し、メモリへのランダムアクセスを実行する命令のストリームで最高のパフォーマンスを発揮するように設計されています。 これまで、開発者はより優れた命令並列性を提供しようとしてきました。つまり、できるだけ多くの命令を並列で実行することです。 そのため、たとえば、特定の条件下でクロックごとに2つの命令を実行できる場合、Pentiumでスーパースカラーの実行が発生しました。 Pentium Proは、命令のアウトオブオーダー実行を受け取りました。これにより、コンピューティングユニットのパフォーマンスを最適化することが可能になりました。 問題は、命令のシーケンシャルストリームの並列実行には明らかな制限があるため、コンピューティングユニットの数を盲目的に増やしても、ほとんどの場合アイドル状態のままであるため、利益が得られないことです。

GPUの操作は比較的簡単です。 これは、一方の側でポリゴンのグループを取得し、もう一方の側でピクセルのグループを生成することで構成されます。 ポリゴンとピクセルは互いに独立しているため、並行して処理できます。 したがって、GPUでは、水晶の大部分をコンピューティングユニットに割り当てることができます。これは、CPUとは異なり、実際に使用されます。

GPUはこれだけでなくCPUとも異なります。 GPUのメモリアクセスは非常に結合されています。テクセルが読み取られると、数サイクル後に隣接するテクセルが読み取られます。 ピクセルが書き込まれるとき、隣接するピクセルは数サイクル後に書き込まれます。 メモリをインテリジェントに編成することで、理論上の帯域幅に近いパフォーマンスを得ることができます。 つまり、GPUは、CPUとは異なり、テクスチャリング操作を高速化する役割があるため、巨大なキャッシュを必要としません。 必要なのは、バイリニアおよびトリリニアフィルターで使用されるいくつかのテクセルを含む数キロバイトです。

GPUでの最初の計算

このようなアプリケーションでの最初の試みは、ラスタライズやZバッファリングなどの一部のハードウェア機能の使用に限定されていました。 しかし、今世紀、シェーダーの出現により、それらは行列の計算を高速化し始めました。 2003年には、GPUコンピューティング用にSIGGRAPHに別のセクションが割り当てられ、GPGPU(GPUでの汎用計算)と呼ばれていました。

最もよく知られているBrookGPUは、GPUで非グラフィック計算を実行するように設計されたBrookストリームプログラミング言語コンパイラです。 登場する前に、計算にビデオチップの機能を使用する開発者は、Direct3DまたはOpenGLの2つの一般的なAPIのいずれかを選択しました。 これにより、GPUの使用が大幅に制限されました。これは、3Dグラフィックスが、並列プログラマーが知る必要のないシェーダーとテクスチャーを使用し、スレッドとコアを使用するためです。 ブルックは彼らの仕事をより簡単にするのを手伝うことができました。 スタンフォード大学で開発されたC言語のこれらのストリーミング拡張機能は、プログラマーから3D APIを隠し、ビデオチップを並列コプロセッサーとして提示しました。 コンパイラは、C ++コードと拡張子を持つ.brファイルを解析し、DirectX、OpenGL、またはx86対応ライブラリにリンクされたコードを生成しました。

Brookの登場により、NVIDIAとATIの関心が高まり、さらにそのまったく新しいセクター、つまりビデオチップをベースにした並列コンピューターが開かれました。

さらに、ブルックプロジェクトの一部の研究者は、ハードウェアとソフトウェアの並列コンピューティング戦略を導入するためにNVIDIA開発チームに異動し、新しい市場シェアを開拓しました。 そして、このNVIDIAイニシアチブの主な利点は、開発者がGPUのすべての機能を細部まで完全に理解しており、グラフィックAPIを使用する必要がなく、ドライバーを使用してハードウェアを直接操作できることです。 このチームの努力の結果がNVIDIACUDAです。

GPUでの並列計算の適用分野

コンピューティングがGPUに転送される場合、多くのタスクで、高速の汎用プロセッサと比較して5〜30倍の加速が達成されます。 最大数(100倍以上の高速化)は、SSEブロックを使用した計算にはあまり適していませんが、GPUには非常に便利なコードで実現されます。

これらは、GPUでの合成コードとCPUでのSSEベクトル化コードの高速化のほんの一例です(NVIDIAによる):

蛍光顕微鏡:12倍。

分子動力学(非結合力計算):8-16x;

静電気(直接およびマルチレベルのクーロン総和):40-120xおよび7x。

NVIDIAがすべてのプレゼンテーションで表示する表。CPUと比較したGPUの速度を示しています。

GPUコンピューティングが使用される主なアプリケーションのリスト:画像と信号の分析と処理、物理シミュレーション、計算数学、計算生物学、財務計算、データベース、ガスと液体のダイナミクス、暗号化、適応放射線療法、天文学、音響処理、バイオインフォマティクス、生物学的シミュレーション、コンピュータービジョン、データマイニング、デジタルシネマとテレビ、電磁シミュレーション、 地理情報システム、軍事アプリケーション、マイニング計画、分子動力学、磁気共鳴イメージング(MRI)、ニューラルネットワーク、海洋学研究、素粒子物理学、タンパク質フォールディングシミュレーション、量子化学、光線追跡、視覚化、レーダー、貯留層シミュレーション、 人工知能、衛星データ分析、地震探査、手術、超音波、ビデオ会議。

CUDAの利点と制限

プログラマーの観点からは、グラフィックスパイプラインは一連の処理ステージです。 ジオメトリブロックは三角形を生成し、ラスタライズブロックはモニターに表示されるピクセルを生成します。 従来のGPGPUプログラミングモデルは次のとおりです。

このようなモデルのフレームワーク内で計算をGPUに転送するには、特別なアプローチが必要です。 2つのベクトルを要素ごとに追加する場合でも、画面または画面外のバッファーに形状を描画する必要があります。 図はラスタライズされ、各ピクセルの色は特定のプログラム(ピクセルシェーダー)に従って計算されます。 プログラムは、各ピクセルのテクスチャから入力データを読み取り、それらを合計して、出力バッファに書き込みます。 そして、これらの多数の操作はすべて、従来のプログラミング言語で単一の演算子で記述されたものに必要です。

したがって、汎用コンピューティングにGPGPUを使用することには、開発者が学習するには複雑すぎるという形で制限があります。 また、ピクセルシェーダーは、ピクセルの最終的な色をその座標に依存させるための公式であり、ピクセルシェーダー言語は、Cのような構文でこれらの公式を記述するための言語であるため、他にも十分な制限があります。 初期のGPGPUメソッドは、GPUのパワーを活用するための巧妙なトリックですが、便利ではありません。 そこにあるデータは画像(テクスチャ)で表され、アルゴリズムはラスタライズプロセスで表されます。 注意する必要があり、メモリと実行の非常に特殊なモデルです。

NVIDIAのGPUでコンピューティングするためのNVIDIAのハードウェアおよびソフトウェアアーキテクチャは、標準の構文、ポインター、およびビデオチップのコンピューティングリソースにアクセスするための最小限の拡張機能を備えた実際のCでGPU用のプログラムを記述できるという点で以前のGPGPUモデルとは異なります。 CUDAはグラフィックAPIに依存せず、汎用コンピューティング用に特別に設計されたいくつかの機能を備えています。

GPGPUコンピューティングへの従来のアプローチに対するCUDAの利点

CUDAは、マルチプロセッサごとに16 KBの共有メモリへのアクセスを提供します。これを使用して、テクスチャフェッチよりも高い帯域幅でキャッシュを編成できます。

システムとビデオメモリ間のより効率的なデータ転送。

冗長性とオーバーヘッドを備えたグラフィックAPIは必要ありません。

線形メモリアドレス指定、および収集と分散、任意のアドレスへの書き込み機能。

整数およびビット演算のハードウェアサポート。

CUDAの主な制限:

実行可能関数の再帰サポートの欠如。

最小ブロック幅は32スレッドです。

NVIDIAが所有するクローズドCUDAアーキテクチャ。

以前のGPGPUメソッドを使用したプログラミングの弱点は、これらのメソッドが以前の非統合アーキテクチャの頂点シェーダー実行ユニットを使用せず、データがテクスチャに格納されてオフスクリーンバッファーに出力され、マルチパスアルゴリズムがピクセルシェーダーユニットを使用することです。 GPGPUの制限には、ハードウェア機能の不十分な効率的な使用、メモリ帯域幅の制限、スキャッター操作なし(収集のみ)、グラフィックAPIの必須使用が含まれます。

以前のGPGPUメソッドに対するCUDAの主な利点は、このアーキテクチャがGPUで非グラフィックスコンピューティングを効率的に使用するように設計されており、グラフィックスの概念に便利な形式にアルゴリズムを移植することなくCプログラミング言語を使用するという事実に由来します。パイプライン。 CUDAは、グラフィックAPIを使用しない新しいGPUコンピューティングパスを提供し、ランダムメモリアクセス(散布または収集)を提供します。 このようなアーキテクチャは、GPGPUの欠点がなく、すべての実行ユニットを使用し、整数数学とビットシフト演算によって機能を拡張します。

CUDAは、共有メモリなど、グラフィックAPIからは利用できないいくつかのハードウェア機能を開きます。 これは、スレッドのブロックがアクセスできる少量のメモリ(マルチプロセッサあたり16キロバイト)です。 これにより、最も頻繁にアクセスされるデータをキャッシュでき、このタスクにテクスチャフェッチを使用するよりも高速なパフォーマンスを提供できます。 これにより、多くのアプリケーションで並列アルゴリズムのスループット感度が低下します。 たとえば、線形代数、高速フーリエ変換、画像処理フィルターに役立ちます。

CUDAとメモリアクセスでより便利です。 グラフィックAPIのコードは、事前定義された領域に32個の単精度浮動小数点値(8つのレンダリングターゲットと同時にRGBA値)としてデータを出力し、CUDAはスキャッターレコーディング(任意のアドレスで無制限の数のレコード)をサポートします。 このような利点により、グラフィックスAPIに基づくGPGPUメソッドを使用して効率的に実装できないGPUでいくつかのアルゴリズムを実行することが可能になります。

また、グラフィカルAPIは必然的にデータをテクスチャに格納するため、大きな配列をテクスチャに事前にパックする必要があり、アルゴリズムが複雑になり、特別なアドレス指定を強制的に使用します。 また、CUDAを使用すると、任意のアドレスでデータを読み取ることができます。 CUDAのもう1つの利点は、CPUとGPU間の通信が最適化されていることです。 また、低レベルにアクセスしたい開発者向けに(たとえば、別のプログラミング言語を作成する場合)、CUDAは低レベルのアセンブリ言語プログラミングの可能性を提供します。

CUDAのデメリット

CUDAのいくつかの欠点の1つは、移植性が低いことです。 このアーキテクチャは、この会社のビデオチップでのみ機能し、すべてでは機能しませんが、GeForce 8および9シリーズと、対応するQuadro、ION、およびTeslaから始まります。 NVIDIAは、9千万のCUDA互換ビデオチップの数字を示しています。

CUDAの代替

書くためのフレームワーク コンピュータープログラムさまざまなグラフィックプロセッサおよび中央処理装置での並列コンピューティングに関連付けられています。 OpenCLフレームワークには、C99標準に基づくプログラミング言語とアプリケーションプログラミングインターフェイス(API)が含まれています。 OpenCLは、命令レベルとデータレベルの並列処理を提供し、GPGPU技術の実装です。 OpenCLは完全にオープンな標準であり、それを使用するためのライセンス料はありません。

OpenCLの目標は、3Dのオープンな業界標準であるOpenGLとOpenALを補完することです。 コンピューターグラフィックス GPUの機能を使用してサウンドを作成します。 OpenCLは、Apple、AMD、Intel、nVidia、Sun Microsystems、SonyComputerEntertainmentなどを含む多くの主要企業を含む非営利コンソーシアムであるKhronosGroupによって開発および保守されています。

CAL / IL(計算抽象化レイヤー/中間言語)

ATI Stream Technologyは、グラフィックスを可能にするハードウェアおよびソフトウェアテクノロジーのセットです。 AMDプロセッサ、CPUと一緒に、多くのアプリケーション(グラフィックスだけでなく)を高速化します。

ATI Streamのアプリケーションは、財務分析や地震データ処理などの計算量の多いアプリケーションです。 ストリームプロセッサを使用すると、中央処理装置のみを使用して同じ問題を解決する場合と比較して、一部の財務計算の速度を55倍にすることができました。

NVIDIAは、ATIストリームテクノロジーを非常に強力な競争相手とは見なしていません。 CUDAとStreamは2つです さまざまなテクノロジーさまざまな開発レベルに立っています。 ATI製品のプログラミングははるかに難しく、言語はアセンブラーのようなものです。 一方、CUDA Cは、はるかに高水準の言語です。 それに書くことはより便利で簡単です。 大規模な開発会社にとって、これは非常に重要です。 パフォーマンスについて言えば、ATI製品のピーク値がNVIDIAソリューションよりも高いことがわかります。 しかし、繰り返しになりますが、それはすべてこの力を得る方法にかかっています。

DirectX11(DirectCompute)

DirectXの一部であるアプリケーションプログラミングインターフェイス。MicrosoftWindowsファミリのオペレーティングシステムを実行しているIBMPC互換コンピュータで実行するように設計されたMicrosoftのAPIセットです。 DirectComputeは、GPGPUコンセプトの実装である、GPUで汎用計算を実行するように設計されています。 DirectComputeは元々DirectX11の一部として公開されていましたが、後にDirectX10およびDirectX10.1でも利用できるようになりました。

ロシアの科学界におけるNVDIACUDA。

2009年12月の時点で、CUDAプログラミングモデルは世界中の269の大学で教えられています。 ロシアでは、CUDAのトレーニングコースは、モスクワ、サンクトペテルブルク、カザン、ノボシビルスク、ペルム州立大学、国際社会自然大学、人間「ドゥブナ」、モスクワ電子研究所の共同核研究所で教えられています。テクノロジー、イワノボ州立電力工学大学、BSTU。 V. G. Shukhova、MSTUim。 バウマン、RKhTUim。 メンデレーエフ、ロシア研究センター「クルチャトフ研究所」、ロシア科学アカデミーの地域間スーパーコンピューターセンター、タガンログ工科大学(TTI SFedU)。