코드가 있습니다 ... 그리고 나는 16cpus에서 실행하려고합니다. 문제는 .. 배열의 qith 인덱스가 15000이고 ... 15000으로 시도하면 mpi가 실행되지 않습니다. 지금까지 ... 나는 800 개의 배열을 가지고 달릴 수 있었다. 어떻게 든 더 큰 배열을 다루는 프로그램을 만들 수 있을까? long int에 데이터 유형을 만들려고했지만 appily mpi_com_rank 및 mpi_com_size는 이러한 데이터 유형을 허용하지 않습니다. 내가 바보 같은 것을 묻는다면 미안하지만 도움을 정말로 사용할 수 있습니다. 고마워. 다음은 샘플 코드입니다 :MPI, 더 큰 배열
#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;
}
나는 비주얼 스튜디오를 사용하여 프로그램을 컴파일하고 있습니다 ... 즉 내가 iostream 라이브러리가 왜 (그래서 난 허공에 내 콘솔 창 cin.ignore..otherwise 사라질를 사용할 수 있습니다. .. 만약 내가 visualstudio에서 화면에 머물도록 설정했다면). 이 수식에서는 .. 나는 최대 5 스레드에서 실행할 수 있습니다.
-np 5 "$ (있는 TargetPath)"5 개 이상으로
.. 실패합니다. 크기를 낮추면 (15000에서 500까지 ... 16 개의 스레드를 사용할 수 있습니다.) -np 16 "$ (TargetPath)" 왜 그럴까요? 어떤 제안이라도 좋습니다.
램이 부족한 것 같습니다. 내 제안 ... 다른 CPU로 전달하기 전에 명명 된/공유 메모리에 배열을 넣고 각 실행 인스턴스에 공유 리소스로 이름을 전달하십시오. 또한, 각 인스턴스가 실제로 코드의 단일 인스턴스이고 동일한 프로세스의 여러 동시 실행을 실행하는 경우 ... I.E. 테이블을 할당하는 프로세스는 다른 모든 CPU 프로세스를 시작하여 테이블 주소를 전달합니다. – user3629249