2013-01-14 2 views
2

64 비트 정수를 MPI_Bcast해야 할 때 시작되었습니다. MPI는 그것을 처리하는 방법을 알고하지 않기 때문에 내가 그랬어 : 수동으로 직렬화하는 대신 MPI_Datatype을 사용해야하는시기는 언제입니까?

template<typename T> 
inline int BcastObjects(T* pointer, 
         int count, 
         int root, 
         MPI_Comm comm) 
{ 
    return MPI_Bcast(pointer, 
        count * sizeof(*pointer), 
        MPI_BYTE, 
        root, 
        comm); 
} 

지금 내가 할 수있는 :
int64_t i = 0; 
BcastObjects(&i, 1, root_rank, some_communicator); 

가 그럼 난 구조의 배열을 통해 보내 BcastObjects를 사용하기 시작했다. 그렇게해도 괜찮은지 궁금합니다.

MPI_Datatype에 대한 매뉴얼은 어떻게해야하는지에 초점을 맞췄지만, 왜 그것을하고 싶지는 않습니다.

+2

64 비트 플랫폼에서는 64 비트 단위로 MPI_LONG_LONG 및 MPI_UNSIGNED_LONG_LONG을 사용할 수 있습니다. – Sergey

+0

@ Sergey 나는 어떻게 든 그것을 놓쳤다. 감사. –

+0

기능 매뉴얼은 MPI 기본 사항이 아니라 인터페이스 및 의미를 문서화합니다. [MPI 표준] (http://www.mpi-forum.org/docs/docs.html) ("Datatypes"장의 첫 번째 장)에는 전체 데이터 형식이 필요하다는 것을 설명하는 전체 페이지가 있습니다. . –

답변

3

MPI_INT64_T을 사용하지 않는 이유는 무엇입니까?

언제든지 MPI_Byte으로 자신의 데이터 유형을 모의 할 수 있습니다. 데이터 유형 물건이 있으므로 그렇게 할 필요가 없습니다. 그리고 많은 경우에 훨씬 쉽습니다. "구멍"이있는 데이터 (예 : 다차원 배열의 조각, 간격이있는 구조의 데이터)를 보내려는 경우 데이터 유형을 상당히 똑바로 매핑 할 수 있지만 수동으로해야합니다 바이트 문자열을 카운트하고 다른 경우 MPI_Pack과 같은 것을 사용하십시오. 물론 데이터 구조의 내용이 변경되면 더 높은 수준의 데이터를 설명하는 것은 당연히 덜 취약합니다.

+0

그래서 내가 보내야 할 데이터 구조가 연속적이지 않을 때 그 대답이 필요하다는 것입니다. 두 번째로 가장 좋은 방법은 자신의 MPI_Op에 사용하는 것입니다. 자신의 MPI_Op를 정의하여 MPI_Reduce에 사용할 수 있습니까? –

+0

당신은 아마 _need_; 당신은 collectives를 결코 필요로하지 않지만, 짧고, 빠르며, 견고하고, 명확한 코드를 만듭니다. 자신의 유형에 따라 고유 한 연산자를 만들 수 있습니다 (예 :이 질문 및 답변, http://stackoverflow.com/questions/9285442/mpi-get-processor-with-minimum-value/9285552#9285552 참조). 하지만 mpi_byte와 counts를 사용하여 할 수있는 일조차 할 수 있습니다. 결국, 그것은 모든 바이트의 전선입니다. 그러나 MPI 데이터 유형을 직접 재 작성하는 대신 사용하는 경우 코드가 더 간단하고 짧으며 오류가 발생하기 쉽고 덜 부서지기 쉽습니다. –

관련 문제