MPI, большие массивы

0

У меня есть код... и я пытаюсь запустить 16 процессоров. Проблема в том, что у меня есть индекс qith массива 15000... и если я пытаюсь с 15000, mpi не запускается. Пока... мне удалось запустить с массивом 800. Могу ли я как-то... работать с большими массивами? Я попытался сделать datatype длинным int.. но aparently 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..otherwise мое консольное окно исчезает в тонком воздухе... даже если я установил его на экране из visualstudio). В этой формуле я могу работать на 5 потоках.

-np 5 "$ (TargetPath)"

с более чем 5.. он терпит неудачу. если я уменьшу размер (от 15000 до 500.. я могу использовать 16 потоков) -np 16 "$ (TargetPath)" Кто-нибудь подозревает, почему? Любое предложение хорошее.

  • 0
    Я подозреваю, что у тебя кончился баран. Мое предложение ... поместить массив в именованную / разделяемую память перед передачей другим процессорам и передать имя в качестве общего ресурса каждому экземпляру выполнения. Кроме того, если каждый экземпляр на самом деле является единственным экземпляром кода и выполняет только несколько одновременных выполнений одного и того же процесса ... IE процесс, который выделяет таблицу, тогда он запускает все другие процессы ЦП, передавая им адрес таблицы
Теги:
arrays
mpi

1 ответ

0
Лучший ответ

Вы выделяете массивы в стек. Вы должны выделить их в кучу. См. Этот вопрос и ответ, чтобы получить большой обзор стека и кучи.

Вам нужно использовать malloc и бесплатно, если C или новый и удалить в C++.

  • 0
    Это должно быть что-то вроде этого? int * array = malloc (size * sizeof (int)); ? потому что я получаю некоторую ошибку void *, которая не может быть выделена сущности типа int *. (я не так хорош с указателями)
  • 0
    реши это. int * array = (int *) malloc (size * sizeof (int)); .. я забыл сыграть. большое спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню