以下版本无法使用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;
}
这是我能够得到这个例子的最小的。似乎base
和A
都必须通过类模板来查看错误,如下所示。
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已不在我的手中。
答案 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
$