2017-01-10 18 views
0

私はIntelプラットフォーム上で動作するOpenCL C++コードを持っています。私は、ポインタがカーネルエンドの構造内で受け入れられないという考えを持っています。しかし、私はクラス内で自己参照ポインターオプションを使用しています。今、私は、構造体を使用することができ、ホスト側の構造体に同じものを複製することができますが、私はデバイス側で同じことをすることはできません。例えばOpenCLの自己参照ポインタ

次のように:

Class Classname{ 
    Classname *SameClass_Selfreferencingpointer; 
    } 
On the Host side I have done the same for the structure as well: 
    struct Structurename{ 
    Structurename *SameStructure_Selfreferencingpointer; 
    } 

誰かがデバイス側のために、この実施のための代替オプションを提供してもらえますか?
事前にお問い合わせいただきありがとうございます。

答えて

1

openclデバイスにmallocがなく、構造体の配列として構造体が構造体の配列として使用されているため、構造体のインデックスを追加して配列内のどこに残っているかを知ることができます。カーネルに先立って大きなバッファを割り当ててから、アトミック関数を使って偽のmallocポインタをバッファから割り振るかわりに、最後に "割り当てられた"構造体インデックスを指す整数を返します。次に、ホスト側はポインタの代わりにインデックスを使用します。

ホストのデバイス間で構造体の整列が問題になる場合は、フィールドのインデックス付けも追加できます。フィールドAの開始バイト、フィールドBの開始バイトなどはすべて、インデックスを除く4つの使用フィールドを持つ構造体の単一の4バイト整数に圧縮されています。

たぶん、あなたは、前処理段階を追加することができます。

  • ホストは、そのようなことは3.1415
  • デバイスを見つけるまで、すべてのバイトオフセットのための構造体でポイントを浮動3.1415
  • デバイスのチェックなど、フィールドに人工の番号を書き込みます見つかったバイトオフセットを配列に格納してホストに送ります
  • ホストはそのバイトオフセットから始まる構造体にfloatフィールドを書き込みます
  • ホストとデバイスがアライメントされるようになりました互換性のある、多分反対ホスト

から構造体を取得し、すべてのカーネルで同じオフセットを使用し

  • デバイスは、構造体の配列に構造体を書き込み、構造体
  • デバイスの分野では3.14を置く方が良いです
  • ホストが3.14のためのバッファ
  • ホストチェックを取得し、バイトがためにオフセット
  • ホストの書き込み、そこから始まるFP数をオフセット見つけます将来の仕事

ホスト+デバイス側でクラスとそのレプリケートされた構造体の両方が必要になります。

「sycl api」も検索する必要があります。

+1

OpenCL KMAはmalloc()およびfree()機能を提供します。 Ben Gaster BlogとRoy Splietのgithubの実装を参照してください。(https://github.com/RSpliet/KMA) –

+1

もしsyclがそれで動作するなら、よりリラックスしたC++が可能でしょうか? –

+0

これを試したい場合、ComputeCppはSYCL実装です。 https://www.codeplay.com/products/computesuite/computecppから入手できます。 –