2013-03-01 4 views
0

안녕하세요, 결과 bool C 배열 (sizeResults의 크기) 및 대부분의 값이 false로 매우 스파 스입니다. 나는 그러나 그것은 매우 많은 시간이 소요되는 모든 근로자에서이 배열을 수집하는 MPI_GATHER을 사용하고 ... MPI G17 스파이크 벡터

MPI_Gather(result, sizeResults, MPI_BYTE, result_final, sizeResults, MPI_BYTE, 0, MPI_COMM_WORLD); 

이 할 수있는 더 효율적인 방법은 무엇입니까? 감사합니다.

답변

2

배열이 얼마나 희소한지에 따라 여러 가지를 생각할 수 있습니다. 한 가지 간단한 방법은 bool 배열을 비트 배열로 압축하여 원래 크기의 1/8로 줄이는 것입니다. 당신이 할 수

다른 것들 다음 true

  1. 대신 Gather 부울을 보내고하는 것은 자신을 값, Gatherv 인덱스. 예를 들어, 프로세스가 배열 { T, F, F, F, F, F, T, F, F, T }을 가지고 있다면, 배열 { 0, 6, 9 }을 보낼 것입니다. 당신이 창조적하려면

  2. , 세그먼트는 다음 true 값에 이르기까지의 모든 false 값 뒤에 true 값으로 정의 세그먼트로 구성된으로 배열 생각합니다. 위의 예를 사용하면 세 세그먼트는 { T, F, F, F, F, F }, { T, F, F }{ T }이됩니다. 이제 각 프로세스에서 Gatherv까지 필요한 것은 각 세그먼트의 길이입니다. 공평하게이 방법은 일반적으로 방법 1보다 효율적이지 않습니다.

+0

답장을 보내 주셔서 감사합니다! MPI에서 어떻게 비트 배열을 사용할 수 있습니까? 마침내 collectv와 같은 방식으로 버퍼를 사용하여 작업자가 버퍼를 사용했습니다. 벡터를 재 할당하고 gatherv로 보내는 것은 시간이 덜 걸릴 것이라고 생각하십니까? –

+0

사실, 방법 1과 2는 정확히 동일한 효율을 가지며 (전처리 시간과 후 처리 시간을주고받습니다) 두 벡터를 연결하는 선형 변환이 존재합니다 (아래 삼각형 행렬 주요 대각선과 그 위에 그리고 그 반대의 "0"). –

+1

@iassael : MPI는 비트 배열을 특별히 지원하지 않지만, 단순히 'MPI_BYTE'의 배열로 보낼 수 있으며 그대로 전달됩니다. 이 시나리오가 특정 시나리오에 대해 다른 방법보다 좋든 나쁘 든간에 말할 수는 없습니다. 직접 측정해야합니다. – suszterpatt