私は非常に迅速に非常に並列にすることができると私が信じている画像処理ルーチンを持っています。各ピクセルは、隣接ピクセルに対して行われる操作に依存しないように約2kの操作が行われる必要があります。そのため、作業を異なる単位に分割することはかなり簡単です。
私の質問は、私が最速のスピードアップを得るために、この変更に取り組むための最善の方法は何ですか?
理想的には、私が探しているライブラリ/アプローチはこれらの基準を満たすべきです:
どのライブラリ/アプローチ/言語を検討する必要がありますか? OpenMP、CUDA、GCDなどを調べましたが、他に欠けているものがあるかどうか疑問に思います。
私は今シェーダやopengl 2.0のようなものに傾いていますが、そのようにすることができるメモリアクセスの数がわからないので、それは正しい呼び出しではないかもしれません。たくさんの方法があります。
最も簡単な方法は、画像を並列に処理できる部分の数(コアによっては4、8、16)に分割することです。それからちょうど各部分のための異なったプロセスを動かしなさい。
これを具体的に行うことに関しては、OpenCLを見てください。それはベンダー特有ではなく、NVidiaとATIの両方がそれをサポートすることを望んでいるので、それはうまく行けばもっと長く続くでしょう。
一般的に、あまりにも多くのデータを共有する必要はないので、プロセスは非常に簡単です。
Threading Building Blockもお勧めします。これをインテル®インテグレーテッド・パフォーマンス・プリミティブ私が働いている会社での画像解析のために。
Threading Building Block(TBB)はOpenMPとCilkの両方に似ています。そしてそれはマルチスレッド化をするためにOpenMPを使います、それは単により単純なインターフェースに包まれています。これで、スレッドをいくつ作成するかを気にする必要はなく、単にタスクを定義するだけです。可能であれば、タスクを分割してすべてをビジー状態に保ち、負荷分散を行います。
Intel Integrated Performance Primitives(Ipp)は、ビジョン用にライブラリを最適化しました。それらのほとんどはマルチスレッドです。私たちが必要とする機能については、IPPにはありませんが、TBBを使用してそれらをスレッド化します。
これらを使用して、画像を作成するためにIPP方法を使用するときに最良の結果が得られます。それがしていることは、与えられたキャッシュラインが完全に1つの行に含まれるように各行をパディングすることです。それでは、スレッドをまたがってイメージ内の行を分割することはしません。そのようにして、同じキャッシュラインに書き込もうとしている2つのスレッドから誤って共有することはありません。
C、C ++、またはFortranのいずれかで既に実用的なシリアルコードをお持ちの場合は、OpenMPを十分に検討する必要があります。他の多くの並列化ライブラリ/言語/システムなどに比べて大きな利点の1つは、一度にループを並列化できることです。つまり、書き直すことなく、あるいはさらに悪いことには再実行することなく、高速化できます。 - デザイン、あなたのプログラム。
あなたの要求に関しては:
OpenMPは高性能コンピューティングでよく使われており、その背後には多くの「重要性」と活発な開発コミュニティがあります - www.openmp.org。
あなたがC、C ++またはFortranを選んだことが十分に運が良ければ、実装するのに十分な速さ。
OpenMPは、並列コンピューティングに対する共有メモリアプローチを実装しているので、「ハードウェアを理解する必要がない」という議論に大きなプラスをもたらします。プログラムを実行して実行時にプロセッサがいくつあるかを把握してから、利用可能なものすべてに計算を分散させることもできます。
あなたがすでに持っているハードウェア上で動きます、高価な、あるいは安い、追加のグラフィックスカードを必要としません。
うん、Windowsシステム用の実装があります。
もちろん、最初にC、C ++、またはFortranを選択しないことが賢明でなかった場合、このアドバイスの多くは、それらの言語のいずれかに書き換えた後にのみ適用されます。
よろしく
マーク