【发布时间】: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++