【问题标题】:Large matrix creation in c++在 C++ 中创建大型矩阵
【发布时间】:2017-08-29 15:34:00
【问题描述】:

我必须创建以下全局矩阵

float m[20][2000][1024][200]

这将占用大约 26 GB 的 RAM,这不是问题。

我可以在 GNU\Linux 操作系统中执行此操作。我怎样才能在 Windows 中做到这一点?为什么 Windows 会强加这种非常烦人的数组维度限制?

一种解决方案可能是在堆中分配一个数组并计算一维索引,但如果是编译器来做,我更喜欢。

它是一个用于动态编程算法的密集矩阵,出于性能目的,我更喜欢使用连续内存进行缓存。

有什么想法吗?

== 更新==

我想发布一个我最终找到的解决方案。一种可能性如下:

float (*m)[2000][1024][200];
m = malloc (20 * sizeof *m);

内存是连续的,可以通过矩阵访问方式访问。

【问题讨论】:

  • 为什么这么大的矩阵?稀疏吗?
  • 如果我是你,我会得到一个真正的矩阵库并使用它。它应该使用动态内存,以便您可以使用系统允许的尽可能多的内存。
  • 您可以使用std::vector<std::vector<std::vector<std::vector<float>>>> m{20, std::vector<std::vector<std::vector<float>>>(2000, std::vector<std::vector<float>>(1024, std::vector<float>(200)))}; 作为“透明”替代品(如果您不需要连续存储)。
  • @Jarod42:在那种情况下,我认为这是个坏主意。
  • 静态分配的数组仅限于0x7fffffff 字节 (2GB),采用 Windows 可移植可执行 (PE) 对象文件格式。在 Linux64 上,我认为使用 ELF 的限制是 0x7fffffffffffffff

标签: c++


【解决方案1】:

一种解决方案可能是分配一个数组并计算一维索引,但如果是编译器来做,我更愿意。

这实际上是个好主意。当然,数组数据应该分配到堆中(在 C++ 中使用 operator new,在 C 中使用 malloccalloc)。并且计算各种索引的偏移量很容易。

你将把这个数组变成一些abstract data type;使用 C++,您可以定义自己的 class MyMatrix(但遵循 rule of five),并且可以在现有的 containers 之上构建它。

您可能应该找到一个好的现有矩阵库。其中一些甚至可能利用特定硬件(例如基于 OpenMP 或 OpenCL)进行优化。

另请参阅this C 方法的答案。

出于性能目的,我更喜欢使用连续内存进行缓存。

此类缓存注意事项仅对计算的最内部循环很重要。另见this

【讨论】:

  • 回答这个问题会很有趣“我可以在 GNU\Linux 操作系统中做到这一点。我如何在 Windows 中做到这一点?为什么 Windows 会施加这种非常烦人的数组维度限制?”与 Linux 相比,Windows 的静态分配内存大小是否有限制?这是一个有趣的问题。
  • 我对Windows一无所知。我从来没有用过它。我从 1993 年开始使用 Linux(无论是在家里还是在工作中)。而且我不知道这是否是 Windows 操作系统的限制,或者是 OP 在其上使用的特定编译器的限制。
  • Linux 怎么样?内存在目标文件的 BSS 部分中定义。它不是在堆上分配的。这些尺寸是否有限。我想也许 ELF 将这些限制在 2 GB 之类的?
  • OP 不应该在 BSS 中分配大数据。它应该是堆分配的。
  • 我同意它应该在堆上完成,但我仍然认为这是一个关于 BSS 中可能的限制分配的有趣问题。 BSS 允许您使用堆无法使用的寻址模式(在 Linux 上)。
猜你喜欢
  • 2018-06-08
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-20
相关资源
最近更新 更多