特別な目的の3Dグラフィックス計算用のCUDAまたはFPGAですか?

StackOverflow https://stackoverflow.com/questions/317731

  •  11-07-2019
  •  | 
  •  

質問

私は、大部分の最も近いポイントおよび範囲検索まで、3Dグラフィックス計算の重い製品を開発しています。いくつかのハードウェア最適化が役立ちます。私はこれについてほとんど知りませんが、上司(ソフトウェアの経験がない)はFPGAを提唱します(調整することができるため)。一方、私たちの後輩開発者はCUPGを使用してGPGPUを提唱します。この質問には判断力が欠けているように感じますが、柔軟性が心配であり、当社の製品はまだ強力に開発されているため、CUDAを使用することもできます。

では、質問を言い換えると、FPGAを採用する理由はありますか?または、3番目のオプションはありますか?

役に立ちましたか?

解決

しばらく前に同じ質問を調査しました。 FPGAに携わった人とチャットした後、次のようになりました。

  • FPGAは、1ミリ秒の遅延でも長すぎるリアルタイムシステムに最適です。これはあなたの場合には当てはまりません。
  • FPGAは非常に高速で、特に明確に定義されたデジタル信号処理用途(レーダーデータなど)に適していますが、優れたものはプロのGPGPUよりもはるかに高価で特殊です;
  • FPGAはプログラムにとって非常に扱いにくいものです。コンパイルするためのハードウェア構成コンポーネントがあるため、数時間かかる場合があります。ソフトウェア開発者よりも、一般的にFPGAで作業する電子エンジニアに適しているようです。

CUDAを動作させることができれば、現時点でおそらく最適なオプションです。確かにFPGAよりも柔軟です。

その他のオプションにはATIのBrookが含まれますが、何か大きなことが起こるまでは、CUDAほど採用されていません。その後、従来のHPCオプション(x86 / PowerPC / Cellのクラスター)はすべて残っていますが、それらはすべて非常に高価です。

役立つこと。

他のヒント

FPGAとCUDAを比較しました。 SIMD形式で問題を本当に定式化でき、合体したメモリにアクセスできる場合、CUDAが輝くことの1つです。メモリアクセスが合体していない場合(1)、または異なるスレッドで異なる制御フローを使用している場合、GPUはパフォーマンスを大幅に低下させ、FPGAはそれを上回る可能性があります。もう1つは、操作が現実的ではないが、膨大な量がある場合です。ただし、1つのカーネルでループを開始することはできません(たとえば、同期のため)、GPUカーネルの呼び出し時間が計算時間を超えます。

また、FPGAの性能は向上する可能性があります(アプリケーションのシナリオに依存します。つまり、GPUは常に計算する場合にのみ(ワット/フロップに関して)安価です)。

オフコースFPGAにはいくつかの欠点もあります:IOは1つになる可能性があります(ここでは70 GB / sが必要でしたが、GPUには問題ありませんが、この量のデータをFPGAに取り込むには、従来の設計に必要なアプリケーションが必要でした)利用できるよりより多くのピン)。別の欠点は、時間とお金です。 FPGAは最高のGPUよりもはるかに高価であり、開発時間は非常に長くなります。

(1)異なるスレッドからメモリへの同時アクセスは、シーケンシャルアドレスでなければなりません。これを達成するのは本当に難しい場合があります。

CUDAを使用します。
私は画像処理に携わっており、長年にわたってハードウェアのアドオンを試してきました。最初にi860、次にTransputer、DSP、FPGAおよびハードウェアへの直接コンパイルがありました。
必然的に起こったのは、ハードウェアボードが実際にデバッグされて信頼性が高くなり、コードが移植されるまでに、通常のCPUが進化してホストマシンのアーキテクチャが変更され、古いボードを使用できなくなったこと、またはボードのメーカーは破産しました。

CUDAのようなものにこだわることで、FPGAボードの小さな専門メーカーに縛られることはありません。 GPUのパフォーマンスはCPUよりも速く改善されており、ゲーマーによって資金提供されています。これは主流のテクノロジーであるため、将来的にはマルチコアCPUと統合される可能性が高いため、投資を保護できます。

FPGA

  • 必要なもの:
    • VHDL / Verilogを学ぶ(そして、あなたがそうしないと信じてくれ)
    • テスト用にハードウェアを購入、合成ツールのライセンス
    • 適切なフレームワークを選択した場合(例: RSoC
      • 設計を開発します(それには何年もかかります)
    • しない場合:
      • DMA、hwドライバ、超高価な合成ツール
      • バス、メモリマッピング、ハードウェア合成に関する多くの知識
      • ハードウェアを構築し、IPコアを購入します
      • 設計の開発
  • たとえば、Xilinx virtex-6チップを搭載した平均的なFPGA pcieカードの価格は3000ドル以上です
  • 結果:
    • 政府から支払われていない場合、十分な資金がありません。

GPGPU(CUDA / OpenCL)

  • すでにテストするハードウェアがあります。
  • FPGAのものと比較:
    • すべてが十分に文書化されています。
    • すべてが安い
    • すべてが動作します
    • すべてがプログラミング言語に統合されています
  • GPUクラウドもあります。
  • 結果:
    • sdkをダウンロードするだけで開始できます。

FPGAベースのソリューションは、CUDAよりもはるかに高価になる可能性があります。

明らかにこれは複雑な質問です。質問には、セルプロセッサも含まれる場合があります。 また、他の関連する質問に対して正しい答えはおそらく1つではありません。

私の経験では、抽象的な方法で行われた実装、つまりコンパイルされた高レベル言語とマシンレベルの実装には、特に複雑なアルゴリズムの実装において、パフォーマンスコストが必然的にかかります。これは、FPGAとあらゆるタイプのプロセッサの両方に当てはまります。複雑なアルゴリズムを実装するために特別に設計されたFPGAは、処理要素が汎用のFPGAよりも優れたパフォーマンスを発揮し、入力制御レジスタ、データI / Oなどからある程度のプログラミングが可能です。

FPGAのパフォーマンスが大幅に向上するもう1つの一般的な例は、プロセス出力が別のプロセスへの入力になり、同時に実行できないカスケードプロセスです。 FPGAでのプロセスのカスケードは単純であり、メモリI / O要件を劇的に下げることができますが、データの依存関係がある2つ以上のプロセスを効果的にカスケードするためにプロセッサメモリが使用されます。

GPUとCPUについても同じことが言えます。キャッシュメモリまたはメインメモリシステムの固有のパフォーマンス特性に関係なく開発されたCPU上で実行されるCで実装されたアルゴリズムは、実装されたアルゴリズムと同様に機能しません。これらのパフォーマンス特性を考慮しないことで、実装が簡単になります。ただし、パフォーマンスコストがかかります。

GPUを直接使用した経験はありませんが、メモリシステムの固有のパフォーマンスの問題を知っているため、GPUもパフォーマンスの問題にさらされます。

これは2008年に開始された古いスレッドですが、それ以降FPGAプログラミングに何が起こったのかを詳しく説明するとよいでしょう。 1. FPGAのC to Gateは、Verilog / SystemVerilog HDLと比較して大幅に時間を節約できる多くの企業の主流の開発です。 Cからゲートへシステムレベルの設計は難しい部分です。 2. FPGA上のOpenCLは、浮動小数点と「クラウド」を含む4年以上存在します。 Microsoft(Asure)およびAmazon F1(Ryft API)による展開。 OpenCLでは、ホストとコンピューティングデバイス間のメモリモデルとAPIが非常に明確に定義されているため、システム設計は比較的簡単です。

ソフトウェアの人々は、固定シリコンであり、外界へのブロードバンド(100Gb +)インターフェイスがないため、GPUとCPUでさえも不可能なことを実行できるように、FPGAアーキテクチャについて少し学ぶ必要があります。チップの形状を縮小することはもはや不可能であり、シングルチップパッケージを融解することなくそれ以上の熱を取り出すこともできないため、これはシングルパッケージチップの道の終わりのように見えます。ここでの私の理論は、将来はマルチチップシステムの並列プログラミングに属し、FPGAがゲームの先を行く大きなチャンスがあるということです。パフォーマンスなどに懸念がある場合は、 http://isfpga.org/ をご覧ください。

CUDAにはかなり多くの例のコードベースと SDK があり、< href = "http://www.nvidia.com/content/cudazone/cuda_sdk/Linear_Algebra.html" rel = "nofollow noreferrer"> BLASバックエンド。あなたがやっていることに似た例を見つけてみてください。おそらく GPU Gems シリーズの本。CUDAがアプリケーションにどの程度適合するかを測定します。ロジスティックの観点から言うと、CUDAは、プロのFPGA開発ツールキットよりも作業が簡単で、はるかに安価です。

ある時点で、私はCUDAを調べて、保険金請求のシミュレーションモデリングを行いました。学習用のWebサイトからリンクされた非常に優れた一連の講義があります。 Windowsでは、グラフィックスサブシステムにウォッチドッグタイマーがあり、実行中のプロセスを5秒以上無効にするため、ディスプレイのないカードでCUDAが実行されていることを確認する必要があります。これはLinuxでは発生しません。

2つのPCI-e x16スロットを持つmahcineは、これをサポートする必要があります。 HP XW9300を使用しました。これは、eBayからかなり安く手に入れることができます。その場合、PCI-eスロットが別々のHypertransportバス上にあるため、2つのCPU(1つのデュアルコアCPUではない)があることを確認してください。両方のバスをアクティブにするには、マシンに2つのCPUが必要です。

私はFPGAの経験が非常に少ないCUDA開発者ですが、2つの比較を見つけようとしています。

これまでの結論:

GPUのピークパフォーマンスははるかに高い(アクセス可能) より有利なフロップ/ワット比があります。 もっと安い それはより速く開発されています(文字通り「本当の」TFLOPが利用できるようになります)。 プログラムする方が簡単です(個人的な意見ではなく、この記事を読んでください)

GPGPUコマーシャルに表示される数字と区別するために、実際/アクセス可能と言っていることに注意してください。

ただし、データへのランダムアクセスを行う必要がある場合、gpuはあまり有利ではありません。これは、オプションのl1 / l2キャッシュを備えた新しいNvidia Fermiアーキテクチャで変更されることを期待しています。

私の2セント

FPGAは、HDLを学習するか、少なくともsystemCを理解する必要があるため、ソフトウェアバイアスのある人には好まれません。

ハードウェアバイアスを使用する場合は、FPGAが最初に検討されるオプションになります。

実際には、両方をしっかりと把握する必要があります。その後、客観的な決定を下すことができます。

OpenCLは、FPGAとアンプの両方で実行するように設計されています。 GPU、CUDAでさえFPGAに移植できます。

FPGA&amp; GPUアクセラレータは一緒に使用できます

したがって、どちらが優れているかは問題ではありません。 CUDA対OpenCLについての議論もあります

&amp;を最適化していない場合も100%の確実性であなたが知ることができない特定のアプリケーションの両方のベンチマークを行いました。

多くの場合、その商業的性質とリソース。他の人は、その汎用性のためにopenCLを使用します。

何にデプロイしていますか?あなたの顧客は誰ですか?これらの質問に対する答えがわからなくても、リアルタイムシステムを構築していて、VHDLやVerilogなどのハードウェア記述言語の知識を持つチームの電気/コンピューターエンジニアがいない限り、FPGAは使用しません。それには多くのことがあり、従来のプログラミングとは異なる考え方を必要とします。

FPGAは、プログラムするのが恐ろしいため、HPCセクターでは好まれなくなりました。 CUDAは、プログラムする方がはるかに優れており、優れたパフォーマンスが得られるためです。私は、HPCコミュニティが行ってきたことに取り組み、CUDAでそれを行います。簡単で、安く、メンテナンスしやすいです。

他の人は良い答えを出しましたが、別の視点を追加したかっただけです。 ACM Computing Surveys 2015で公開されている私の調査論文(パーマリンクはこちら)、GPUをエネルギー効率メトリックでFPGAおよびCPUと比較します。ほとんどの論文レポート:FPGAはGPUよりもエネルギー効率が高く、GPUはCPUよりもエネルギー効率が高いです。電力バジェットは固定されているため(冷却能力に依存)、FPGAのエネルギー効率により、FPGAで同じ電力バジェット内でより多くの計算を実行でき、GPUよりもFPGAでより良いパフォーマンスが得られます。もちろん、他の人が述べたように、FPGAの制限も考慮してください。

  • FPGAはGPUよりも3桁並列です。優れたGPUには数千のコアが搭載されていますが、FPGAには数百万のプログラマブルゲートがある場合があります。
  • CUDAコアは生産性を高めるために非常によく似た計算を行う必要がありますが、FPGAセルは互いに完全に独立しています。
  • FPGAはいくつかのタスクグループで非常に高速であり、多くの場合、1ミリ秒が長い期間として既に使用されている場合に使用されます。
  • GPUコアはFPGAセルよりもはるかに強力であり、プログラミングがはるかに簡単です。これはコアであり、FPGAセルがかなり単純なブールロジックのみに対応している場合、問題なく分割および乗算できます。
  • GPUコアはコアなので、C ++でプログラミングするのが効率的です。 FPGAをC ++でプログラムすることも可能ですが、非効率的です(「生産的」なだけです)。 VDHLやVerilogなどの専用言語を使用する必要があります-それらは習得するのが難しく、困難です。
  • ソフトウェアエンジニアの本能と試行された本能のほとんどは、FPGAでは役に立ちません。これらのゲートで forループが必要ですか?あなたはどの銀河からですか?この世界を理解するには、電子技術者の考え方に変える必要があります。

最新のGTC'13では、多くのHPCの人々がCUDAが留まることに同意しました。 FGPAは面倒で、CUDAはPython / C / C ++ / ARMをサポートするためにかなり成熟しています。どちらにしても、それは時代遅れの質問でした

CUDAでGPUをプログラミングするのは間違いなく簡単です。 HDLでFPGAをプログラミングした経験がない場合は、ほぼ間違いなく難題になりますが、CUDAに似たOpenCLでプログラミングすることはできます。ただし、実装は難しく、おそらくGPUのプログラミングよりもはるかに高価です。

どちらが速いですか

GPUはより高速に動作しますが、FPGAはより効率的です。

GPUには、FPGAが到達できるよりも高速で実行できる可能性があります。ただし、そのために特に適したアルゴリズムのみ。アルゴリズムが最適でない場合、GPUは多くのパフォーマンスを失います。

一方、FPGAははるかに低速で実行されますが、非常に効率的で短時間で処理を完了する問題固有のハードウェアを実装できます。

それは、スプーンでスープをゆっくり食べるのに対して、フォークでスープを非常に速く食べるようなものです。

両方のデバイスのパフォーマンスは並列化に基づいていますが、それぞれ少しずつ異なります。アルゴリズムを同じ操作を実行する多くの部分に細分化できる場合(キーワード:SIMD)、GPUは高速になります。アルゴリズムを長いパイプラインとして実装できる場合、FPGAは高速になります。また、浮動小数点を使用したい場合、FPGAはそれで満足しません:)

私は修士論文全体をこのトピックに捧げました。 Algorithm a>

scroll top