2011-11-15 9 views
4

私は問題があります:高速リニアシステム解決(私はそのようなシステムがたくさんあります)。 GPUとOpenCLを使って解決しようと思います。PyOpenCL vs Clyther vs純粋なOpenCLとC99:初心者にとっては最高のものは何ですか?

私は、このようなRubyやPythonなどの動的言語を愛し、私は、だから私は2つの同時狙い持っC.

のような低レベルの言語を使用しての習慣の外に出た:

  1. は、このようなOpenCLのソリューションを開発できるだけ少ない努力でI のような速い線形システムを解くことができます。
  2. パフォーマンスを大幅に落とさないでください。私は便宜上2〜10倍の減速をしたくないが、高水準の言語での作業には30〜50%を支払う用意がある。

ほとんどの場合、OpenCL CでほとんどPythonコードを無駄なくコンパイルします。

純粋なOpenCL C、PyOpenCLClytherが見つかりました。

どうすればいいですか?

+1

あなたが計算を行うのに慣れているほど多くのことを行うには、Cythonのようなものを使ってカスタムCライブラリへのバインディングを作成してください。 – millimoose

答えて

4

私の意見では、OpenCLに動的言語を振り回すことは努力に値するものではありません。あなたはPythonについて好きなもののほとんどを失い、おそらく最後にあなたの努力のための多くの時間を節約しません。

しかし、私はPythonでOpenCLカーネルを書くことしか話していません。カーネルの準備と提出を行うホストアプリケーションもあります。 Pythonが好きなら、OpenCL APIにアクセスするPyOpenCLのようなラッパーを使って純粋なPythonでホストアプリケーションを書くことをお勧めします。そして、あなたのカーネルを純粋なOpenCLで書いて、あなたのPythonアプリケーションにそのまま提出させてください。私はこれがあなたがPythonから望むものの大半を得て、パフォーマンスはほとんど必要ないと考えています。

+2

PyOpenCLは非常によく書かれています。それは私に多くの時間を節約しました。純粋なPython/Numpy Mandelbrotの計算を250倍以上速く修正することができました。ナンシーはどちらも遅くはなかった!それはCコンパイルコードを活用していましたが、PyOpenCLバージョンではスラッグのように見えました。それを上手くするために、私はPyOpenCLがそれらをサポートしているので、アルゴリズムNumpy配列の両方のバージョンを供給しています。 – Demolishun

1

OpenCLでプログラミングするのが最も難しいのは、アルゴリズムを並列化することです。つまり、カーネルを書くことです。おそらく、大部分の時間をあなたのOpenCL Cコードを調整して理解することに費やしています。AFAIKはカーネルを書くための唯一の選択肢です。

私は純粋なC/OpenCLの実装について言います。 「定型化された」OpenCL APIの部分が稼働したら、その部分を変更する必要はありません。何かがあれば、あなたはclEnqueueNDRangeKernelに渡すワークグループサイズのようなもので遊んでいます。

あなたがCLの初心者であれば、私は単純にしておきます。問題に別のソフトウェアレイヤーを追加すると(特にリニアソルバーと同様に定義される問題)、作業が複雑になります。

EDIT:

私はあなたが標準のOpenCL APIを使用するときは、オンラインヘルプ/サポートのためにあなたの可能性を広げていること追加する必要があります。 Pythonバインディングのいずれかを選択すると、それらのコミュニティの人々に潜在的なサポートが制限されることがあります。

関連する問題