2013-06-13 3 views
1

MPI 구문을 사용하여 C++ 프로그램을 작성하려고합니다. 거대한 파일을 읽고 그 번호를 배열에 저장하고 싶습니다. 배열을 로컬로 만들고 싶습니다. 즉, 배열이 매우 부피가 크기 때문에 모든 스레드가 전체 배열을 가지기를 바랄뿐입니다. 각 스레드는 로컬 계산을 수행하고 추후 계산을 위해 "전송"및 "수신"합니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 온라인에서 볼 수있는 모든 코드는 rand() 함수를 사용하여 로컬 배열을 생성하지만 파일에서 값을 읽고 싶습니다.MPI 배포 배열

이 가능하다 내가 원하는 원하는 :

int main() 
{ 
    // Read from a file 
    // store in array a[] temporarily 
    //MPI_init(); 
    //My thread should have an array b[] that is a subset of a[] 
    //MY code to do a numerical simulation 
    //MPI_finalise(); 
    return 0; 
} 

PS를 : 내 데이터 구조가 배열보다 더 복잡하다. 거대한 그래프를 저장합니다. 이것은 연결된 목록의 배열이나 벡터 배열과 같습니다.

+1

안녕하세요. 귀하의 질문에 대답하기 위해 귀하로부터 더 많은 정보가 필요합니다. 배포하려는 데이터의 형식을 설명하십시오. 또한이 데이터를 노드에 분산시키는 방법을 설명해야합니다. – Nobody

답변

1

MPI는 스레드가 아닌 프로세스간에 시스템을 전달하는 메시지입니다. 프로세스가 다른 시스템에서 실행될 때 실제 차이점이 있습니다.

그래프의 각 부분에 원하는 작업이 독립적으로 수행되면 parrallel을 읽으려고합니다. 기타 왜 하나 개 읽기가 있고 같은 것이다 배열 확산하려는 경우 :

int main(int argc, char * argv[]) 
{ 
    MPI_init(&argc, &argv); 
    int prank; MPI_Comm_rank(MPI_COMM_WORLD, &prank); 
    int psize; MPI_Comm_size(MPI_COMM_WORLD, &psize); 
    if(prank == 0) { 
     // Read from a file 
     // store in array a[] temporarily 

     MPI_Scatter(a, length(a)/psize, MPI_DATATYPE_OF_A, b, leanght(a)/psize, MPI_DATATYPE_OF_A, 0, MPI_COMM_WORLD); 
     // this works only if length(a) is a multiple of psize, otherwhy you should go for MPI_Scatterv 
    } else { 
     MPI_Scatter(NULL, 0, MPI_DATATYPE_OF_A, b, leanght(a)/psize, MPI_DATATYPE_OF_A, 0, MPI_COMM_WORLD); 
    } 
    //My thread should have an array b[] that is a subset of a[] 
    //MY code to do a numerical simulation 

    MPI_finalise(); 
    return 0; 
} 

을하지만 배열이있는 경우이는 아이디어 당신이 그래프가있을 경우 그래프 파티션 프로그램에서 모습을 제공한다 귀하의 그래프를 분할하고 다른 procs에 조각을 보냈습니다. 나는 Trilinos이 당신을 위해 모든 것을한다고 생각합니다. 그 외에도 Scotch 또는 Metis를 사용하여 그래프를 색칠 한 다음 MPI를 사용하여 각 색상을 프로세서로 보낼 수 있습니다.

+0

감사! 이것은 유용합니다. par-Metis를 사용하여 그래프를 분할 할 계획입니다. 그래프의 각 부분을 개별 프로세스로 보내는 방법에 대해서도 살펴볼 것입니다. – Shank