2012-02-15 2 views
0

이 빠른 구현에서 나는 실행중인 프로그램이 내가 이해할 수없는 근본적인 경쟁 조건에 빠지게된다고 생각합니다. 그래서 나는 지도력을 위해 SO 커뮤니티에 몸을 돌린다.C로 작성된 quicksort의 레이싱 조건이 OpenMP와 병렬 처리 됨

quicksort()에서 for-loop 앞에 "#pragma omp parallel for private (i)"을 제거하면 제대로 정렬됩니다.

다음은 정렬 샘플 및 코드입니다.

Unsorted 
3 6 7 5 3 5 6 2 9 1 

Sorted 
0 1 2 3 3 5 6 7 9 5 



    size_t average (size_t a, size_t b) 
    { 
      return (a + b)/2; 
    } 

    void swap (int *array, size_t x, size_t y) 
    { 
      int tmp; 
      tmp = array[x]; 
      array[x] = array[y]; 
      array[y] = tmp; 
    } 

    void quicksort (int *array, int left, int right) 
    { 
      int i, last; 

      if (left >= right) 
      { 
        return; 
      } 

      swap (array, left, average(left, right)); 
      last = left; 

      #pragma omp parallel for private(i) 
      for (i = left + 1; i <= right; i++) 
      { 
        if (array[i] < array[left]) 
        { 
          #pragma omp critical 
          { 
            last++; 
          } 
          swap(array, last, i); 
        } 
      } 

      swap (array, left, last); 

      #pragma omp parallel sections 
      { 
        #pragma omp section 
        { 
          quicksort(array,left,last-1); 
        } 

        #pragma omp section 
        { 
          quicksort (array, last+1, right); 
        } 
      } 
    } 

답변

3

해당 루프에서 수행하는 스왑 작업은 서로 크게 관련됩니다. 여기서 병렬 처리를 얻을 수있는 방법이 없습니다.

그러나 두 개의 병렬 섹션을 사용하여 개발하는 분기 병렬 처리에서는 이것이 필요하지 않습니다. 성능 문제가 있습니까?

0

나는 보통 멀티 쓰레드를 시도 할 때 퀵소트를 서브 영역으로 나눕니다. 이렇게하면 각 스왑 작업은 다른 모든 작업과 독립적입니다. 스왑 작업이 구현에 문제가있는 것처럼 보입니다.

스택을 사용하여 정렬해야하는 하위 범위를 저장할 수 있는지 여부는 잘 모르겠지만 구현시 가장 적합한 것으로 나타났습니다. OpenMP를 사용하여 듀얼 8 코어 워크 스테이션을 운영하고 있습니다. 16 개의 코어는 처음 몇 단계를 제외하고는 100 %입니다.

관련 문제