我正在编写分子动力学模拟,一些内核将使用CUDA进行计算。我使用一些c ++ 11功能开发了一个简单的CPU实现代码。现在我必须添加一些CUDA代码,我必须使用不支持c ++ 11功能的编译器(gcc< = 4.6)。
在我的makefile中,我分别从所有cpp文件创建对象,最后将它们全部链接在一起。此外,我的代码被拆分的方式是,可以使用“现代”编译器编译没有CUDA的部分,而使用旧编译器编译其余部分(利用CUDA)。
我现在的问题是,如果这样可以,或者我是否会以这种方式遇到问题?
答案 0 :(得分:1)
我不知道Cuda,但我知道的是 将C ++ 98和C ++ 11目标文件链接在一起非常危险,因为模板实例化只会在最终的可执行文件中发出一次。 关键是,ABI可能已经改变了。
我曾经使用std::complex<double>::real()
和g ++遇到过这个问题。两个实例之一返回指向double
的指针,另一个指向double
istelf。
链接器只将两个实例中的一个(直接返回的两个实例)发送到最终的可执行文件中,然后调用C ++ 98代码误认为是指针,导致段错误。
为什么会发生这种情况,请查看<complex>
:
根据不同的__cplusplus >= 201103L
,real()
可以这样声明:
constexpr _Tp real();
或者这样:
const _Tp& real() const { return _M_real; }
我怀疑除了std::complex
之外还有更多的例子。