2017-12-13 30 views
0

파생 데이터 유형을 생성하려고합니다. 내 문제는 그것이 size_of() 함수와 유사해야한다는 MPI_Type_extent의 사용이다른 컴퓨터에서 C++ mpi 파생 데이터 유형

int blocks[3] = {1,1,1}; 
    MPI_Datatype types[3] ={MPI_INT,MPI_DOUBLE,MPI_DOUBLE};  
    MPI_Aint displacements[3]; 

    MPI_Datatype MPI_Struct; 
    MPI_Aint doublex; 

    MPI_Type_extent(MPI_DOUBLE,&doublex); 

    displacements[0]=static_cast<MPI_Aint>(0); 
    displacements[1]=doublex; 
    displacements[2]=doublex+doublex; 

    MPI_Type_struct(3,blocks,displacements,types,&MPI_Struct) 

입니다 :

struct { 
    int provider; 
    double service; 
    double cost; 
} MPI_Struct; 

웹 설명서에 따라, 나는 그런 일을 작성해야 : 특히이 같은 구조체가 원하는 . 내 컴퓨터가 MPI_Datatype_exent이라는 다른 컴퓨터의 클러스터에서 실행되기 때문에 다른 컴퓨터의 한 프로세스에서 다른 프로세스로 My_Struct을 전달할 때 아무런 문제가 없다는 것을 확신 할 수 있습니까? 내가 잘못 아니에요 경우

는 유형

여기
+0

기계의 확장 범위는 무엇입니까? – Zulan

+0

이 순간 나는 정확한 차이를 모르겠다. 그들은 대학 컴퓨터이고 아직 사용하지 않았습니다. – dang92

+0

모든 것이 완전히 균질해야합니다. 다른 OS/설치/버전/MPI 구현/컴파일러 옵션/바이너리/CPU의 혼합에서 MPI를 실행하지 마십시오. 실제로 수행중인 작업을 알지 못하는 경우입니다. – Zulan

답변

0

내가이

typedef struct { 
    int provider; 
    double service; 
    double cost; 
} mystruct; 

displacements[0]=static_cast<MPI_Aint>(offsetof(mystruct, provider)); 
displacements[1]=static_cast<MPI_Aint>(offsetof(mystruct, service)); 
displacements[2]=static_cast<MPI_Aint>(offsetof(mystruct, cost)); 
MPI_Type_struct(3,blocks,displacements,types,&tmp_ddt); 
MPI_Type_create_resized(tmp_ddt, static_cast<MPI_Aint>(0), static_cast<MPI_Aint>(sizeof(mystruct)), &MPI_Struct); 
MPI_Type_free(&tmp_ddt); 

내가 확신 MPI_INTMPI_DOUBLE 비트의 표준입니다 작성합니다 어떻게 .. 비트 길이의 표준 없습니다 length (fwiw, Fortran MPI_INTEGER 데이터 유형은 아닙니다.)하지만 컴파일러가 사용할 수있는 패딩은 그렇지 않습니다. 그 이유는 offsetof() 매크로를 사용하여 displacements 배열을 채우고 데이터 형식의 크기를 조정하는 이유입니다.

+0

감사합니다! MPI_create_resized는 정확히 무엇을합니까? 저는 mpi가 새롭고 특히 파생 된 유형이 있습니다. – dang92

+0

'MPI_Type_create_resized()'는 기본적으로 범위를 설정합니다. 'MPI_Send()'두 원소가 있다면, 첫 번째 원소는 오프셋 '0'에서 시작하고, 두 번째 원소는 오프셋 'extent'에서 시작합니다. MPI와 컴파일러가 구조체의 끝에 패딩 (있는 경우)을 처리한다는 보장이 없으므로 MPI에 컴파일러가 선택한 것을 명시하는 것이 더 안전합니다. –