2012-02-19 2 views
0

총계를 계산하고 합계의 최소값을 찾아야합니다. 순차적으로 처리 할 수 ​​있지만 mpi를 사용하여 병렬화하는 데 어려움을 겪고 있습니다. 직렬, 나는 특정 금액을 계산하고 그래서 최소를 찾습니다하지 포함병렬 처리에 문제가있는 경우

 MPI_Init(&argc, &argv); 
     MPI_Comm_size(MPI_COMM_WORLD, &numprocs); 
     MPI_Comm_rank(MPI_COMM_WORLD, &myid); 
        . 
        . 
        . 
     x = (size)/numprocs; 
     low = myid * x; 
     high = low + x; 

     for(i =low; i < high; i++){ 
      for(j = low; j < high; j++){ 
       for(k = low; k < high; k+=gap){ 
        for(m = low; m < high; m+=gap){ 
             c1 = calculation1(i,j,k,m); 
         if(c1 > cutoff){ 
          sum += calculation2(modifier1[k][m], modifier2[k][m]); 
         }  
        } 
       } 

       MPI_Reduce(&sum, &result, 1, MPI_FLOAT, MPI_SUM, 0, MPI_COMM_WORLD); 
       sum = 0; 
      } 
     } 
    MPI_Reduce(&result, &minimum, 1, MPI_FLOAT, MPI_MIN, 0, MPI_COMM_WORLD); 
    if(0 == myid) 
    printf("The min is: %f", minimum); 
    MPI_Finalize(); 

내가 해봤 다른 변화 : 이것은 현재 MPI를 사용하여 병렬 버전이 무엇

for(i = 0; i < size; i++){ 
    for(j = 0; j < size; j++){ 
     for(k = 0; k < size; k+=gap){ 
      for(m = 0; m < size; m+=gap){ 
       c1 = calculation1(i,j,k,m); 
       if(c1 > cutoff){ 
        sum += calculation2(modifier1[k][m], modifier2[k][m]); 
       } 
      } 
     } 
     if(sum < min){ 
      min = sum; 
     } 
     sum = 0; 
    } 
} 

MPI_Min 인수와 함께 MPI_Reduce를 사용하고 최소한 내 자신의 메서드를 사용하여 직렬 버전과 같은 대답을 얻지는 못합니다. 내 잘못 행동이 여기에있는 것에 대한 통찰력은 인정 될 것입니다.

답변

1

내부 루프 만 분할하고 내부 루프는 동일하게 유지하십시오. 네 가지 프로세스가있는 경우 각 프로세스가 작업의 1/4을 수행하는 것이지 "1/4 분기"작업은 수행하지 말아야합니다.

각 프로세스에 대한 지역 합계와 지역 최소값을 별도로 추적하고 모든 작업이 완료된 후 각 프로세스의 합계와 최소값 만 합산해야합니다. 이는 첫 번째 "MPI_Reduce()"를 루프 밖으로 이동하고 두 번째 "MPI_Reduce()"가있는 위치에 놓는다는 것을 의미합니다. 또한 프로세스의 로컬 최소값을 결정하기 위해 여전히 "if (sum < min) {min = sum;}"을 수행해야 함을 의미합니다.

관련 문제