次のように、両方ともデバイス定数メモリに格納されている別の定数に関して定数を定義しようとすると、次のようになります。
__device__ __constant__ float x=0.1;
__device__ __constant__ float y=2*x;
エラーが発生します:
エラー:デバイス上で空でないコンストラクタまたはデストラクタのコードを生成できません
ヒントはありますか?
次のように、両方ともデバイス定数メモリに格納されている別の定数に関して定数を定義しようとすると、次のようになります。
__device__ __constant__ float x=0.1;
__device__ __constant__ float y=2*x;
エラーが発生します:
エラー:デバイス上で空でないコンストラクタまたはデストラクタのコードを生成できません
ヒントはありますか?
__constant__
と同じではありませんconst
。特に、__constant__
オブジェクトはホストから変更できます。したがって、コンパイラはコンパイル時の評価を適用できません。実行時にデバイスコード内から__constant__
オブジェクトを書き込むことはできないため、実行時の初期化もできません。さらに、実際のカーネルコードが実行を開始する前に、このような初期化を実行できるデバイスのinitルーチンはありません。コンパイラによって生成されたエラーメッセージは、その最後の事実をほのめかしているようです。
次に、定義された定数を使用できます。
#define MAGIC_NUMBER_1 (0.1f)
#define MAGIC_NUMBER_2 (2.0f * MAGIC_NUMBER_1)
__constant__ float x = MAGIC_NUMBER_1;
__constant__ float y = MAGIC_NUMBER_2;