【问题标题】:Dynamic Memory Allocation to Multidimensional Array with MPI使用 MPI 对多维数组进行动态内存分配
【发布时间】:2018-09-26 21:30:25
【问题描述】:

我目前正在对通过药物贴剂的扩散过程进行建模,其中涉及使用数值方法求解 PDE。我当前的问题是尝试在 C 中为多维数组动态分配内存。

我要分配内存的数组是:

双联[1000][1000][1000];

还可以动态地将内存分配给另一个维度的数组吗?我正在 64 位系统上编写代码,但是,我使用 shell(Bitvise SSH 客户端)来编译代码,以便我可以在超级计算机(BlueShark?)上运行它。

双联[1000][1000][1000][1000];

有人提示我使用 MPI 来完成这项任务?

感谢您的关注和帮助!

【问题讨论】:

  • 1) 发布执行“我要分配内存的数组是:”的代码 2) 先尝试小于 1000 的值,例如 10。
  • double marray[1000][1000][1000]; 分配内存很简单:double (*a)[1000][1000][1000] = malloc (sizeof *a); - 尽管您的机器可能缺乏资源和足够宽的size_t
  • 嘿 Chux 感谢您的回复,我使用动态内存分配的唯一做法是将内存分配给矩阵(2-D),因此我不知道从哪里开始(3- D) 或 (4-D)。也许有指针的东西?
  • @TimBroslav:超级计算机通常只是快速网络上的大量小型机器。您需要找到一种方法将阵列分布在多台机器上 - 例如对于 1000 台机器,每台机器大约有 8 GiB,并且不会在任何一台机器上拥有全部 8 TiB 的数据。 C 不会为您执行此操作,您需要某种库(例如,可能是“Open MPI”)。
  • OPM 只是 C 的扩展,这是我正在使用的,我应该提到这一点,对不起。

标签: c multidimensional-array mpi dynamic-memory-allocation


【解决方案1】:

有几种方法可以制作多维数组。我给你举几个例子: 1: 让 l, m, n, o,.. 成为你在不同维度上的尺寸。

double ****MyArr(int l, int m, int n, int o) {
    double ****array = new double ***[l];
    for (int i = 0; i<l; i++) {
        array[i] = new double **[m];
        for (int j = 0; j<m; j++) {
            array[i][j] = new double *[n];
            for (int k = 0; k < n; k++)
            {
                array[i][j][k] = new double [o];
            }

        }
    }
    return array;
}

2:

改为创建一维指针

double *myArr new double [l*m*n*o];
//access to [a][b][c][d]
myArr[a*m*n*o + b*n*o + c*o + d]=0.0;

一些备注:

您似乎正在处理一个大矩阵,请确保使用的是连续数组。

如果您需要在进程之间进行通信,请确保尽可能使用集体通信。

所有进程都会创建类似大小的数组,很可能每个进程只会使用这个数组的一部分,其余的将白白占用你的内存。确保根据进程数量使用正确的大小。

【讨论】:

    猜你喜欢
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    相关资源
    最近更新 更多