2013-05-04 3 views
2

여기에 여러 페이지를 읽었으며 이전과 비슷한 질문이 게시되어 사용 가능한 솔루션을 찾을 수없는 것 같습니다.MPI_Send/Recv C++ std :: string 분할 오류

이 코드는 처음부터 끔찍한 코드를 제공하지만 우리는 그것을 사용해야합니다 :/나는 모든 것을 해결할 것을 요구하지 않습니다. 단지 MPI_Send와 Recv만으로는 부족합니다.

마스터 :

string parent; //Is initialised to a random sequence of characters before I try the send 
int parentSize = parent.size()+1; 

for (int i = 1; i < processes; i++)//Send current parent to slaves 
{ 
    MPI_Send(&parentSize, sizeof(int), MPI_INT, i, MSIZE, MPI_COMM_WORLD); //This works fine 
    MPI_Send(&parent, parent.size(), MPI_BYTE, i, MSEND, MPI_COMM_WORLD); 
} 

노예 :

int parentSize; 

MPI_Recv(&parentSize, sizeof(int), MPI_INT, 0, MSIZE, MPI_COMM_WORLD, &status); //Works fine 
MPI_Recv(&parent, parentSize, MPI_BYTE, 0, MSEND, MPI_COMM_WORLD, &status); //Gives a segfault when I try to cout parent 

내가 메모리의 잘못된 양을 할당하는 건가요? 크기() 문자열 (28) 및 null 종결 자 +1에 대한 문자 수를 반환합니다 믿습니다?

+0

저는 MPI에 익숙하지 않지만'std :: string :: size()'가 string + null terminator의 길이를 반환하지 않는다고 말할 수 있습니다. 단지 문자 수를 반환합니다. 'std :: string'은 널 터미네이터의 개념을 추상화하기로되어 있습니다 (전혀 사용하지 않는다면 확실하지 않습니다). http://www.cplusplus.com/reference/string/string/ –

+0

characters는 길이이고 NULL 종결자를 설명하기 위해 수동으로 1을 더합니다. 내가 읽은 문서는 그들이 동의어라고 말했습니다. – T3CHN0CR4T

+0

오 derp, 그건 완전히 내 머리 xD 갔다. 난 기술적으로 *'std :: string'과 c-strings (''char *'/ NULL terminator)가 동의어가 아니기 때문에 주어진 답은 더 좋은 아이디어라고 생각한다. IIRC,'std :: string'은 C- 문자열로 표현 될 수 있지만, 다른 메타 데이터를 저장할뿐만 아니라 과도하게 할당 할 수도 있습니다. –

답변

3

MPI_Send (parent.c_str(), parent.size() ....);를 시도 할 수 있습니다. 다른 쪽에서 char buf [parentSize]를받습니다.

+0

나는 이것을 시험해 보았지만 여러번의 변환을 계속해야 할 것 같았고 단지 지저분했다. 따라서 주어진 코드를 사용하여 표준 코드를 사용해야하므로 솔루션을 선호하지 않아도된다. 문자열 :/ – T3CHN0CR4T

+1

부스트를 사용해도 상관이 없다면 바로 할 수 있습니다. 예 : http://www.boost.org/doc/libs/1_53_0/doc/html/mpi/tutorial.html#mpi.point_to_point. (나는 lib가 장면 뒤에서 그 변환을 처리한다고 가정합니다) – elvena