コンパイル時の設定に使用される構造体内に NVCC コンパイラの静的アサートを設定する最良の方法は次のとおりです。
以下はほとんどの場合機能しますが、NVCC がでたらめなエラー メッセージを生成し、コンパイルする必要がある場合でもコンパイルしないことがあります。
template<int A, int B>
struct Settings{
static const int a = A;
static const int b = B;
STATIC_ASSERT(a == 15);
}
typedef Settings<15,5> set1; // Comment this out and it works....
template<int A, int B>
struct Settings2{
static const int a = A;
static const int b = B;
STATIC_ASSERT(a % b == 0);
}
typedef Settings<10,5> set2;
静的アサートは機能しません。わかりませんが、CUDA Compiler BUG があり、コンパイルすると STATIC_ASSERT(a == 15); がスローされることが通知されます。上記のコードが正しいためにコンパイルする必要がある場合でも、(A) をコメントアウトすると、突然動作します。基本的に Boost から取得した Thrust の STATIC_ASSERT を使用します。
#define JOIN( X, Y ) DO_JOIN( X, Y )
#define DO_JOIN( X, Y ) DO_JOIN2(X,Y)
#define DO_JOIN2( X, Y ) X##Y
namespace staticassert {
// HP aCC cannot deal with missing names for template value parameters
template <bool x> struct STATIC_ASSERTION_FAILURE;
template <> struct STATIC_ASSERTION_FAILURE<true> { enum { value = 1 }; };
// HP aCC cannot deal with missing names for template value parameters
template<int x> struct static_assert_test{};
};
// XXX nvcc 2.3 can't handle STATIC_ASSERT
#if defined(__CUDACC__) && (CUDA_VERSION > 100)
#error your version number of cuda is not 2 digits!
#endif
#if defined(__CUDACC__) /* && (CUDA_VERSION < 30)*/
#define STATIC_ASSERT( B ) typedef staticassert::static_assert_test<sizeof(staticassert::STATIC_ASSERTION_FAILURE< (bool)( (B) ) >) > JOIN(thrust_static_assert_typedef_, __LINE__)
#define STATIC_ASSERT2(B,COMMENT) STATIC_ASSERT(B)
#else
#define STATIC_ASSERT2(B,COMMENT) \
typedef staticassert::static_assert_test< \
sizeof(staticassert::STATIC_ASSERTION_FAILURE< (bool)( (B) ) >)>\
JOIN(thrust_static_assert_typedef_, JOIN(__LINE__, COMMENT ))
#define STATIC_ASSERT( B ) \
typedef staticassert::static_assert_test<sizeof(staticassert::STATIC_ASSERTION_FAILURE< (bool)( (B) ) >) > JOIN(thrust_static_assert_typedef_, __LINE__)
#endif // NVCC 2.3
誰かが同じ問題を経験しましたか?
コメントありがとうございます!