2017-03-17 9 views
2

저는 MPI를 사용하여 분산 이미지 (그레이 스케일) 컨볼 루션을 구현하고 있습니다. 내 기존 패턴은 루트 프로세스에서 이미지를 1D 병합 된 배열로 읽은 다음 루트 프로세스에서 MPI_Gather을 수행 한 다음 이미지를 다시 1D로 평평하게 써야합니다 (행 분해). 정렬. 이미지 컨볼 루션 (image convolution)으로 인해 상황이 경계에서 까다로워지기 때문에 이것은 분명히 예상 된 결과를 제공하지 못합니다.MPI의 고스트 셀 교환 패턴

if (rank == 0) { 
    src = null 
    dest = rank + 1 
} 

if (rank == size - 1) { 
    src = rank - 1 
    dest = null 
} else { 
    src = rank - 1 
    dest = rank + 1 
} 

MPI_SendRecv(&sendbuf[offset], slen, dest.. 
      &recvbuf[offset], rlen, src); 

가 어떻게이 "유령 메모리를 할당 않습니다

따라서, 상기 패턴을 개선하기 위해, 나는 과정이 의사에서 ghost rows.에서 자신의 행을 교환하는 것을 특징으로 소위 ghost cell exchange 패턴을 구현하려면 행 "? 메모리를 미리 할당 한 다음 분산시켜야합니까? 내가 고려하고있는 문제의 범위를 과도하게 다루기 때문에 "custom-datatype"솔루션을 사용하고 싶지 않습니다.

답변

2

고스트 셀은 보통 셀과 동일한 메모리 블록에 속해야합니다. 그렇게하면 주소 지정 체계를 간단하게 유지할 수 있습니다. 이 체계에서 이미지는 MPI_ScatterMPI_Gather을 사용하여 완전한 행의 배수로 분산됩니다. 비 국경 순위에서 당신은 두 개의 추가 유령 행에 대한 충분한 메모리를 할당 :

height = total_hight/ranks; 
std::vector<float> data(width * (height + 2)); 
float* image = &data[width]; 
float* ghost_north = &data[0] 
float* ghost_south = &data[width * (height + 1)] 
float* inner_north = image; 
float* inner_south = &image[width * (height - 1)] 
MPI_Scatter(root_image, width * height, MPI_FLOAT, 
      image, width * height, MPI_FLOAT, ...); 
... 
iterations { 
    MPI_SendRecv(inner_north, width, MPI_FLOAT, north, tag, 
       ghost_north, width, MPI_FLOAT, north, tag, ...) 
    MPI_SendRecv(inner_south, width, MPI_FLOAT, south, tag, 
       ghost_south, width, MPI_FLOAT, south, tag, ...) 
    ... compute ... 
} 
MPI_Gather(image, width * height, MPI_FLOAT, 
      root_image, width * height, MPI_FLOAT, ...); 

이 의사는 특별한 경계 사례를 고려하지 않습니다.

간단한 일차원 분할의 문제는 통신 비용과 추가 할로 데이터가 최적이 아니라는 것입니다. 특히 작은 이미지와 많은 수의 참여 랭킹이 필요합니다.

여기에는 MPI를 사용한 데이터 분리 및 후광 통신 방법에 관한 excellent example by Rolf Rabenseifner이 있습니다. 또한 의사 소통 방법을 개선 할 수있는 방법을 설명합니다. 2D 분해의 경우 초기 통신 및 수직 경계 모두에 대해 파생 된 MPI 데이터 유형이 필요합니다.

+0

답변을 작성해 주셔서 감사합니다. 의사 소통 비용에 대해 언급했습니다. 이제 이미지 크기가 커지면서이 모델을 테스트하면 성능이 떨어집니다. –

+0

기본적으로 1D 분해의 통신 비용은 2D 분해 *보다 나쁩니다. 통신 오버 헤드는 이미지 크기 (더 큰 = 더 낳음), 순위 (덜 = 더 좋음) 및 반복마다 계산 (더 좋음)의 균형에 따라 다릅니다. – Zulan

+0

나는 그 부분에 동의한다. 1d 통신은 많은 교류를 필요로 할 것이다. 모든 도움에 감사드립니다. 빨리 답변을 수락하겠습니다. –