NVCC和编译器Bug的静态断言

时间:2011-07-08 17:24:30

标签: cuda nvcc

在用于编译时设置的struct中为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编译器BUG告诉我在编译它时会抛出STATIC_ASSERT(a == 15);即使IT应该编译,因为上面的代码是正确的,如果我评论(A)然后它突然工作, 我使用来自Thrust的STATIC_ASSERT,它基本上来自Boost:

    #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

有没有人遇到同样的问题?

感谢您的任何评论!

1 个答案:

答案 0 :(得分:2)

在每个struct定义后添加缺少的分号后,您的代码编译时没有任何警告或错误。系统详情:

harrism$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2010 NVIDIA Corporation
Built on Thu_Nov_11_15:26:50_PST_2010
Cuda compilation tools, release 3.2, V0.2.1221

harrism$ g++ --version
i686-apple-darwin10-g++-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5666) (dot 3)