2011-02-04 2 views
10

3.2バージョンのCUDAドキュメントの付録Dでは、CUDAデバイスコードのC++サポートを参照しています。
CUDAは「コンピューティング機能2.xのクラス」をサポートしていることは明らかです。しかし、私は計算能力1.1と1.3のデバイスで作業しています。この機能を使うことができます!CUDAデバイスコードでサポートされている実際のC++言語構造は何ですか?

例えば、このコードは動作します:

// class definition voluntary simplified 
class Foo { 
    private: 
    int x_; 

    public: 
    __device__ Foo() { x_ = 42; } 
    __device__ void bar() { return x_; } 
}; 


//kernel using the previous class 
__global__ void testKernel(uint32_t* ddata) { 
    Foo f; 
    ddata[threadIdx.x] = f.bar(); 
} 

私はまた、このようなスラスト::ランダムランダム生成クラスとして広範なライブラリを使用することができますよ。 私は、__device__マークされた関数の自動インライン化のおかげでこれを行うことができたと思いますが、これはメンバー変数withalの処理については説明していません。

このような機能を同じ条件で使用したことがありますか、または私のCUDAコードがこのように動作する理由を説明できますか?リファレンスガイドに何か間違いがありますか?

答えて

11

通常、CUDAは2.0より前のデバイスではクラスをサポートしていません。

実際、私の経験から、コンパイル時に機能が解決できる限り、すべてのデバイスですべてのC++機能を使用できます。 2.0より前のデバイスは関数呼び出しをサポートしていません(すべての関数がインライン展開されています)。プログラムは変数アドレスにジャンプしません(定数アドレスでのみジャンプします)。

これは、あなたが構築++以下のCを使用できることを意味します:あなたはNVCCにstubleまで

  • 可視性(パブリック/プライベート/保護された)
  • 非仮想継承
  • テンプレート全体のプログラミングとメタプログラミングを(バグ:バージョン3.2のようにかなりあります)
  • コンストラクタ(オブジェクトが__ shared __メモリで宣言されている場合を除く)
  • 名前空間

次を使用することはできません。

  • &削除演算子(私はデバイスが> = 2.0はそれを行うことができると信じて)
  • 仮想メソッド(変数のアドレスにジャンプが必要です)
  • 関数再帰(新すべての関数呼び出し)
  • 例外
  • 実際

を必要とし、 CUDAプログラミングガイドのD.6章の例は、デバイス用にコンパイルできます< 2.0

+0

あなたの答えは、制限に関する興味深い点をもたらします。コンパイル時の必要性は、コンピューティング能力<2.Xのデバイスを扱う際に考慮すべきポイントのようです。 – jopasserat

+0

問題を調査したところ、私はあなたよりも良い答えを見つけることはできません。したがって、私はあなたの経験に頼っています:)とにかく、私は今ではC2050を所有していますので、コードを移植可能な状態に保つために実行を比較することができます。あなたの答えをありがとう@ CygnusX1 – jopasserat

0

一部のC++クラスの機能は動作しますが、プログラミングガイドでは完全にサポートされていないと言われているため、すべて C++クラスの機能は動作します。あなたがやろうとしていることをすることができれば、先に進むべきです!

+0

申し訳ありませんが、私は何がうまくいくかを知る必要があります。私はライブラリーでこれらの機能を使用しようとしているので、安全でない場合はその機能に頼ることはできません。私たちは、このコードがいくつかの状況で大混乱を招くと容易に想像することができました。私が本当に必要とするのは、私がやるべきこととそうでないことの間の正確なフロンティアです。 – jopasserat

関連する問題