无法从继承的 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;
}
这是我能够得到的最小示例。 base
和 A
似乎都必须 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
$
以下无法使用 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;
}
这是我能够得到的最小示例。 base
和 A
似乎都必须 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
$