【问题标题】:MPI , bigger arrays更大的阵列
【发布时间】:2014-08-28 16:50:56
【问题描述】:

我有一个代码...我正在尝试在 16 个 CPU 上运行。问题是..我的数组 qith 索引为 15000 ......如果我尝试使用 15000 ,mpi 无法运行。到目前为止...我设法运行了 800 个数组。我能以某种方式制作...该程序可以处理更大的数组吗?我试图将数据类型设置为 long int .. 但显然 mpi_com_rank 和 mpi_com_size 不接受这种数据类型。 对不起,如果我问一些愚蠢的问题......但我真的可以使用帮助。非常感谢。这是一个示例代码:

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
#include "iostream"
#include "mpi.h"
#define size 15000

int main(int argc, char *argv[] ) {

    int numprocs, rank, chunk_size, i;
    int max, mymax,rem;
    int array[size];
    MPI_Status status;

    MPI_Init( &argc,&argv);
    MPI_Comm_rank( MPI_COMM_WORLD, &rank);
    MPI_Comm_size( MPI_COMM_WORLD, &numprocs);

    printf("Hello from process %d of %d \n",rank,numprocs);
    chunk_size = size/numprocs;
        rem = size%numprocs;

    if (rank == 0) {
    /* Initialize Array */
        printf("REM %d \n",rem);
        for(i=0;i<size;i++) {
            array[i] = i;
        }
    /* Distribute Array */
        for(i=1;i<numprocs;i++) {
            if(i<rem ) {
            MPI_Send(&array[i*chunk_size],chunk_size+1, MPI_INT, i, 1, MPI_COMM_WORLD);
            } else {
            MPI_Send(&array[i*chunk_size],chunk_size, MPI_INT, i, 1, MPI_COMM_WORLD);
            }
        }
    }
    else {
        MPI_Recv(array, chunk_size, MPI_INT, 0,1,MPI_COMM_WORLD,&status);
    }
   /*Each processor has a chunk, now find local max */
   mymax = array[0]; 
   for(i=1;i<chunk_size;i++) {
        if(mymax<array[i]) {
            mymax = array[i];
        }
    }
    printf("Array els 1-5 for rank %d: %d %d %d %d %d\n",rank,array[0],array[1],array[2],array[3],array[4]);
    printf("Last 5 Array els for rank %d: %d %d %d %d %d\n",rank,array[chunk_size-5],array[chunk_size-4],array[chunk_size-3],array[chunk_size-2],array[chunk_size-1]);
    printf("The Max for rank %d is: %d\n",rank,mymax);

   /*Send local_max back to master */ 
    if (rank == 0) {
      max = mymax; //Store rank 0 local maximum
        for(i=1;i<numprocs;i++) {
            MPI_Recv(&mymax,1, MPI_INT, MPI_ANY_SOURCE, 1, MPI_COMM_WORLD,&status);
            if(max<mymax) max = mymax;
        }
        printf("The Max is: %d",max);
    }
    else {
        MPI_Send(&mymax, 1, MPI_INT, 0,1,MPI_COMM_WORLD);
    }
    MPI_Finalize();
    std::cin.ignore();
    return 0;
}

我正在使用 Visual Studio 编译程序。这就是我拥有 iostream 库的原因(所以我可以使用 cin.ignore 。否则我的控制台窗口会消失得无影无踪……即使我将其设置为保持打开状态来自visualstudio的屏幕)。在这个公式中.. 我可以在最多 5 个线程上运行。

-np 5 "$(目标路径)"

超过 5.. 失败。如果我降低尺寸(从 15000 到 500 .. 我可以使用 16 个线程) -np 16 "$(目标路径)" 有人怀疑为什么吗?任何建议都是好的。

【问题讨论】:

  • 我怀疑你的内存用完了。我的建议......在移交给其他 CPU 之前将数组放在命名/共享内存中,并将名称作为共享资源传递给每个执行实例。此外,如果每个实例实际上是代码的一个实例,并且只运行同一进程的多个同时执行......一个分配表的进程,然后它启动所有其他 CPU 进程,将表的地址传递给它们

标签: c++ c arrays mpi


【解决方案1】:

您正在将数组分配到堆栈。您需要将它们分配到堆中。有关stack and heap 的详细概述,请参阅此问题和答案。

如果是 C,你需要使用 malloc and free 或在 C++ 中使用 new and delete

【讨论】:

  • 应该是这样的吧? int * array= malloc(size * sizeof(int)); ?因为我遇到了一些 void* 错误,无法分配给 int* 类型的实体。 (我不太擅长指针)
  • 解决它。 int * 数组 = (int*)malloc(size * sizeof(int)); ..我忘了投。非常感谢。
猜你喜欢
  • 2018-12-27
  • 2021-08-23
  • 2011-05-01
  • 2015-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多