2014-07-08 2 views
0

코드가 있습니다 ... 그리고 나는 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)" 왜 그럴까요? 어떤 제안이라도 좋습니다.

+0

램이 부족한 것 같습니다. 내 제안 ... 다른 CPU로 전달하기 전에 명명 된/공유 메모리에 배열을 넣고 각 실행 인스턴스에 공유 리소스로 이름을 전달하십시오. 또한, 각 인스턴스가 실제로 코드의 단일 인스턴스이고 동일한 프로세스의 여러 동시 실행을 실행하는 경우 ... I.E. 테이블을 할당하는 프로세스는 다른 모든 CPU 프로세스를 시작하여 테이블 주소를 전달합니다. – user3629249

답변

0

배열을 스택에 할당하려고합니다. 이를 힙에 할당해야합니다. stack and heap에 대한 개요를 보려면이 질문과 대답을 참조하십시오.

C의 경우 malloc and free 또는 C++의 경우 new and delete을 사용해야합니다.

+0

이것은 다음과 같아야합니다. int * array = malloc (size * sizeof (int)); ? 메신저 int * 형식의 엔티티로 할당 할 수없는 void * 오류가 발생하기 때문에. (나는 포인터로 그다지 좋지 않다) – Matt

+0

그것을 해결한다. int * array = (int *) malloc (size * sizeof (int)); .. 나는 던지기를 잊었다. 많은 감사. – Matt