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

Cannot call assert() from inherited class

以下无法使用 nvcc(v6.0 至 7.5)编译。科学Linux;海湾合作委员会 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 似乎都必须 class 模板才能命中错误,如下所示。

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 是我无法控制的。

What is wrong with it?

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

Or, if nothing, is there a workaround?

根据我的测试,下面似乎是 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
$