【发布时间】:2017-01-25 14:11:05
【问题描述】:
我正在将一个执行数字模拟的程序从 FORTRAN 翻译成 C++。
我必须处理 800MB 大小的双倍大矩阵。 这个
double M[100][100][100][100];
给出一个分段错误,因为堆栈不是那么大。 使用 new,delete 很尴尬,因为我需要四个 for 循环来分配我的数组,甚至释放它。
std::array 在堆栈中,所以不好。 std::vector 将是一个不错的选择,所以
第一个问题 std::vector 适合快速模拟还是
vector<vector<vector<vector<int,100>,100>,100>,100>
会携带大量无用的繁重数据吗?
第二个问题 您知道我可以使用的任何其他数据结构吗?也许有来自 boost 的东西。
目前我只是在使用这个解决方案:
double * M = new double [100000000];
我正在手动访问我需要的条目。 如果我没有找到任何其他高性能解决方案,我将编写一个自动管理最后一个方法的类。
第三个问题你认为这会显着降低性能吗?
【问题讨论】:
-
单个分配的块是矩阵的不错选择。
-
std::vector<double> M(100000000);可能是最好的。 -
你应该看看 Boost 多维数组库:boost.org/doc/libs/1_61_0/libs/multi_array/doc/user.html
-
重要的是要知道 STL 容器有内存开销(它们的成本不仅仅是存储的元素),因此嵌套它们(vector
>)通常不是一个好主意。我建议您完全按照您的做法(单块内存)。为了提高代码的易读性,您可以将其打包在一个类中并重载 operator(int,int,int,int) 以检索元素。
标签: c++ vector hpc numerical-computing