У меня есть код... и я пытаюсь запустить 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)" Кто-нибудь подозревает, почему? Любое предложение хорошее.
Вы выделяете массивы в стек. Вы должны выделить их в кучу. См. Этот вопрос и ответ, чтобы получить большой обзор стека и кучи.
Вам нужно использовать malloc и бесплатно, если C или новый и удалить в C++.