2011-10-01 23 views
14

私はいくつかのプロジェクトでOpenCLを扱ってきましたが、カーネルを常に(たまに大きな)関数として書きました。今私はより複雑なプロジェクトに取り組んでおり、いくつかのカーネル間で機能を共有したいと考えています。大規模なOpenCLカーネルの構造

しかし、すべての例では、カーネルを1つのファイルとして表示しています(2次関数を呼び出すことはほとんどありません)。 clCreateProgramWithSource()は複数の文字列を受け入れることができます(それらを組み合わせると思います)。pyopenclのProgram()は単一のソースしか取りませんが、複数のファイルを使用することは可能です。

だから私は経験がこれをやって誰からも聞きたい:

  • は、複数のソースファイルに関連するすべての問題はありますか?
  • pyopenclがファイルを単純に連結する最善の方法はありますか?
  • 関数のライブラリをコンパイルする方法はありますか?(すべてではないにしても、各カーネルでライブラリソースを渡すのではなく)
  • 毎回ライブラリのソースを渡す必要がある場合、未使用の関数は破棄されます(オーバーヘッドはありません)?
  • その他のベストプラクティス/提案はありますか?

ありがとうございます。

+2

#include "part1.cl" #include "part2.cl"を持つ1つの連結ファイルを作成できます。これは私のために働く(NVidiaコンパイラ)、おそらくアプリケーションが動くたびにすべてがコンパイルされる。 私は、関数コードが各カーネルにインライン展開されるので、プリコンパイルされた関数のライブラリを持っているのはちょっとしたSFであると思います(再帰関数を書くことができない理由です)。ありがとう。 –

答えて

6

OpenCLには、プログラム内に複数のソースファイルの概念があるとは思いません。プログラムは1つのコンパイル単位です。ただし、#includeを使用して、コンパイル時にヘッダやその他の.clファイルをプルすることはできます。

OpenCLプログラムに複数のカーネルを持つことができます.1つのコンパイルの後、コンパイルされたカーネルのセットを呼び出すことができます。

機能がないか、または静的に到達不能であることがわかっているものは、コンパイル時に、コンパイル時に多少の費用がかかっていると見なすことができます。

+0

これは私がやっていることです。残念ながら、pyopenclはカーネルをキャッシュするときに#includeの内容を考慮しません。 "ライブラリ"ファイルを変更しても、手動でキャッシュを削除しない限り、コンパイルされたカーネルには影響しません。とにかく、誰かがより良いアイデアを持っているかどうかを確認してから、あなたに最高の(と唯一の)マークを付けます。乾杯。 –

+0

それが本当であれば、clCreateProgramWithSourceの構文はかなり厄介ですね。これは明示的に複数の文字列とそれぞれの文字列の長さを必要とします。私はそれが実際に動作するかどうかはわかりません(私はここでそれを動作させようとしています)が、構文が与えられても動作しないということは奇妙に聞こえます... – user1111929

5

OpenCL 1.2では、異なるオブジェクトファイルをリンクしています。

+0

thanks;私はトップのopenclの仕事を取り戻すときにこれを試してみるでしょう。 –

関連する問題