4

我正在编写分子动力学模拟,一些内核将使用 CUDA 计算。我使用一些 c++11 特性从一个普通的 CPU 实现开始我的代码。现在我必须添加一些 CUDA 代码,我必须使用不支持 c++11 功能的编译器(gcc <= 4.6)。

在我的 makefile 中,我分别从所有 cpp 文件创建对象,最后将它们全部链接在一起。此外,我的代码以这样一种方式进行拆分,即可以使用“现代”编译器编译没有 CUDA 的部分,而使用较旧的编译器编译其余部分(使用 CUDA)。

我现在的问题是,这是否可以,或者我是否会/可能会遇到这种方式的问题?

4

1 回答 1

1

我不了解 Cuda,但我知道将 C++98 和 C++11 目标文件链接在一起是非常危险的,因为模板实例化只在最终可执行文件中发出一次。关键是,ABI 可能已经改变。

std::complex<double>::real()我曾经和 g++遇到过这个问题。两个实例之一返回一个指向 a 的指针double,另一个返回doubleistelf。链接器仅将两个实例中的一个(直接返回双精度数的)发射到最终的可执行文件中,然后调用的 C++98 代码将双精度数误认为是指针,从而导致段错误。

对于为什么会发生这种情况,只需查看<complex>:取决于__cplusplus >= 201103L是否real()以这种方式声明:

constexpr _Tp real();

或者这样:

const _Tp& real() const { return _M_real; }

std::complex我怀疑除了周围还有更多的例子。

于 2013-06-28T19:07:43.777 回答