私は、重い3Dグラフィック計算を使用した製品を開発しています最も近い点と範囲の検索。いくつかのハードウェア最適化が役立つでしょう。私はこれについてほとんど知りませんが、上司(ソフトウェアの経験がない)はFPGAを擁護します(それは調整できるため)。この質問では判断力が足りないと感じますが、柔軟性が心配なので、CUDAを使用する方法もあると思いますが、私たちの製品はまだ強力な開発段階にあります。
では、質問を言い換えると、FPGAを採用する理由は何ですか?または、3番目のオプションはありますか?
私はしばらく前に同じ質問を調査しました。 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、次にトランスピューター、次にDSP、そしてFPGAとハードウェアへの直接コンパイルがありました。
必然的に起こったことは、ハードウェアボードが実際にデバッグされて信頼性があり、コードがそれらに移植されたときです-通常のCPUがそれらを打ち負かすように進歩しているか、ホスティングマシンのアーキテクチャが変更されて使用できませんでした古い板、または板のメーカーは破産しました。
CUDAのようなものに固執することで、FPGAボードの1つの小さな専門メーカーに縛られることはありません。 GPUのパフォーマンスはCPUよりも速く向上しており、ゲーマーから資金提供を受けています。これは主流のテクノロジであるため、将来的にはマルチコアCPUと統合され、投資を保護するでしょう。
これは2008年に始まった古いスレッドですが、それ以来FPGAプログラミングに何が起こったかを振り返るとよいでしょう。1. FPGAのゲートからゲートへの移行は、Verilog/SystemVerilog HDLと比較して時間を大幅に節約する多くの企業にとって主流の開発です。 Cでゲートシステムレベルの設計は難しい部分です。 2. FPGA上のOpenCLは、Microsoft(Asure)およびAmazon F1(Ryft API)による浮動小数点および「クラウド」の展開を含め、4年以上存在します。ホストとコンピューティングデバイス間のメモリモデルとAPIが非常に明確に定義されているため、OpenCLシステムの設計は比較的簡単です。
ソフトウェアの人々は、固定シリコンであることと、外界へのブロードバンド(100Gb +)インターフェースがないことの両方の理由により、GPUとCPUでは不可能であることができるようにするために、FPGAアーキテクチャについて少し学ぶ必要があります。チップジオメトリの縮小は不可能であり、シングルチップパッケージからそれを溶かすことなくより多くの熱を抽出することはできないため、これはシングルパッケージチップの道の終わりのように見えます。ここでの私の論文は、将来はマルチチップシステムの並列プログラミングに属し、FPGAはゲームをリードする大きなチャンスがあるということです。パフォーマンスなどについて懸念がある場合は、 http://isfpga.org/ を確認してください。
FPGAベースのソリューションは、CUDAよりもはるかに高価になる可能性があります。
明らかにこれは複雑な問題です。質問には、セルプロセッサも含まれる場合があります。そして、おそらく他の関連する質問に正しい単一の答えはありません。
私の経験では、抽象的な方法で行われた実装、つまりコンパイルされた高水準言語とマシンレベルの実装は、複雑なアルゴリズムの実装では特に、必然的にパフォーマンスコストを伴います。これは、FPGAとあらゆるタイプのプロセッサの両方に当てはまります。複雑なアルゴリズムを実装するために特別に設計されたFPGAは、処理エレメントが汎用のFPGAよりもパフォーマンスが高く、入力制御レジスター、データI/Oなどからのある程度のプログラマビリティを可能にします。
FPGAがはるかに高いパフォーマンスを発揮できるもう1つの一般的な例は、カスケードプロセスであり、オンプロセス出力が別のプロセスへの入力となり、同時に実行することはできません。 FPGAでのプロセスのカスケードは単純で、メモリI/O要件を劇的に下げることができますが、プロセッサメモリは、データ依存関係がある2つ以上のプロセスを効果的にカスケードするために使用されます。
GPUとCPUについても同じことが言えます。 Cで実装されたアルゴリズムは、キャッシュメモリまたはメインメモリシステムの固有のパフォーマンス特性に関係なく開発されたCPU上で実行され、実装されたアルゴリズムと同じように実行されません。確かに、これらのパフォーマンス特性を考慮しないと、実装が簡単になります。ただし、パフォーマンスが犠牲になります。
GPUの直接的な経験はありませんが、GPU固有のメモリシステムのパフォーマンスの問題を知っているため、GPUもパフォーマンスの問題に影響されます。
私はCUDA開発者であり、FPGAについて非常にわずかな経験を積んでいますが、2つの間の比較を試みています。
これまでに結論したこと:
GPUははるかに高い(アクセス可能な)ピークパフォーマンスを持っています。GPUは、より好ましいFLOP /ワット比を持っています。それはより安価ですそれはより速く開発されています(まもなくあなたは文字通り「本物の」TFLOPが利用可能になるでしょう)。プログラムする方が簡単です(これについての個人的な意見ではなく、記事を読んでください)
GPGPUコマーシャルに表示される数値と区別するために、実際の/アクセス可能なと言っていることに注意してください。
しかし、データへのランダムアクセスを実行する必要がある場合、gpuはそれほど有利ではありません。これは、オプションのl1/l2キャッシュを備えた新しいNvidia Fermiアーキテクチャで変更されると期待しています。
私の2セント
FPGAは、HDLを学習するか、少なくともsystemCを理解する必要があるため、ソフトウェアに偏見がある人には好まれません。
ハードウェアバイアスFPGAを使用する場合は、最初のオプションを検討します。
実際には、両方をしっかりと把握する必要があり、客観的な決定を下すことができます。
OpenCLはFPGAとGPUの両方で実行するように設計されており、CUDAもFPGAに移植できます。
FPGAとGPUアクセラレーターを一緒に使用できます
したがって、どちらが優れているかということではありません。 CUDAとOpenCLについての議論もあります
ここでも、特定のアプリケーションに対して最適化とベンチマークの両方を行わない限り、100%確実に知ることはできません。
多くの企業は、その商業的性質とリソースのために、単にCUDAを採用します。その他は、その汎用性のためにopenCLを使用します。
CUDAには、かなり充実したコードベースの例と [〜#〜] sdk [〜#〜] があり、 a BLASバックエンド が含まれています。 CUDAがアプリケーションにどれだけ適合するかを測定するために、おそらく GPU Gems シリーズの本も見て、あなたがしていることに似たいくつかの例を見つけてみてください。ロジスティクスの観点から言うと、CUDAは他のプロフェッショナルFPGA開発ツールキットよりも扱いやすく、はるかに安価です。
ある時点で、私はクレームリザーブシミュレーションモデリングのためにCUDAを調べました。学習用のWebサイトからリンクされた非常に優れた一連の講義があります。 Windowsでは、グラフィックスサブシステムには5秒以上実行中のプロセスを起動するウォッチドッグタイマーがあるため、CUDAがディスプレイのないカードで実行されていることを確認する必要があります。これはLinuxでは発生しません。
2つのPCI-e x16スロットを備えたマシンは、これをサポートする必要があります。私はHP XW9300を使用しました。これはebayをかなり安くピックアップできます。使用する場合は、PCI-eスロットが別々のハイパートランスポートバス上にあり、両方のバスをアクティブにするにはマシンに2つのCPUが必要であるため、2つのCPU(1つのデュアルコアCPUではない)があることを確認してください。
他の人は良い答えを出し、別の見方を加えたかっただけです。これが私の調査です paper ACM Computing Surveys 2015に発行されました(そのパーマリンクは here )。これは、GPUとFPGAおよびCPUのエネルギー効率メトリックを比較します。ほとんどの論文は、FPGAがGPUよりもエネルギー効率が高く、GPUがCPUよりもエネルギー効率が高いことを報告しています。電力バジェットは固定されているため(冷却能力に応じて)、FPGAのエネルギー効率は、FPGAを使用すると同じ電力バジェット内でより多くの計算を実行でき、FPGAを使用するとGPUよりもパフォーマンスが向上することを意味します。もちろん、他の人が述べたように、FPGAの制限も考慮に入れます。
何を展開していますか?あなたの顧客は誰ですか?これらの質問に対する答えさえわからなければ、リアルタイムシステムを構築していて、VHDLやVerilogなどのハードウェア記述言語の知識を持つチームに電気/コンピュータエンジニアがいない限り、FPGAを使用しません。それには多くのことがあり、従来のプログラミングとは異なる考え方が必要です。
FPGAはプログラムするのが恐ろしいエラーであるため、HPCセクターでは支持されなくなりました。 CUDAは、プログラミングがはるかに優れており、優れたパフォーマンスが得られるためです。私は、HPCコミュニティが行ってきたことに取り組み、CUDAでそれを行います。それはより簡単で、より安く、より保守可能です。
遅くともGTC'13で、多くのHPC人々がCUDAが留まることに同意しました。 FGPAは扱いにくく、CUDAはPython/C/C++/ARMをサポートするかなり成熟したものになっています。どちらにせよ、それは古い質問でした