将MPI与c ++ 11和CUDA相结合

时间:2013-04-17 08:28:54

标签: c++ c++11 cuda mpi

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

为什么会发生这种情况,请查看<complex>: 根据不同的__cplusplus >= 201103Lreal()可以这样声明:

constexpr _Tp real();

或者这样:

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

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