无法从继承的类调用assert()

时间:2017-03-01 20:39:26

标签: c++ cuda nvcc

以下版本无法使用nvcc进行编译(v6.0虽然为7.5)。科学Linux; GCC v4.4.7。这有什么问题?或者,如果没有,是否有解决方法?

#include <assert.h>

template <typename T>
struct base {};

template <typename T>
struct A : base<T>
{
    __host__ __device__ void f()
    {
        assert(0);
    }
};

int main()
{
    A<int> a;
    a.f();
    return 0;
}

这是我能够得到这个例子的最小的。似乎baseA都必须通过类模板来查看错误,如下所示。

sam@machine:$ nvcc mwe.cu 
mwe.cu: In member function ‘void A<T>::f()’:
mwe.cu:11:66: error: expected id-expression before ‘__PRETTY_FUNCTION__’
         assert(0);

编辑在使用CUDA工具包的v8.0(和gcc v4.9.2)在不同的系统上进行测试后,它似乎编译得很好。但不幸的是,升级到CUDA 8.0已不在我的手中。

1 个答案:

答案 0 :(得分:2)

  

它出了什么问题?

我不确定它有什么问题。正如您已经指出的那样,它在CUDA 8下编译得很好,所以它很可能是CUDA 7.5的“问题”。更新到CUDA 8可能是一个很好的处理方法。

  

或者,如果没有,是否有解决方法?

根据我的测试,以下似乎是CUDA 7.5的解决方法。我相信还有其他可能性。

一种CUDA 7.5解决方法可能性:

$ cat t952.cu
#include <assert.h>

__host__ __device__
void my_assert(bool condition){

  assert(condition);
}

template <typename T>
struct base {};

template <typename T>
struct A : base<T>
{
    __host__ __device__ void f()
    {
        my_assert(0);
    }
};
$ nvcc -c t952.cu
$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2015 NVIDIA Corporation
Built on Tue_Aug_11_14:27:32_CDT_2015
Cuda compilation tools, release 7.5, V7.5.17
$