2017-04-14 3 views
1

스파이크 뉴런 네트워크에서 일부 시뮬레이션을 실행하는 코드를 병렬 처리하려고합니다. 여기에는 하나의 더블 루프가 관련되어 있는데, 여기서 '#pragma omp parallel for'을 메인 루프 외부에 둔다. 여기서 코드이다 : 병렬로 pragma omp 병렬로 중첩 된 루프

int main(void){ 

    int i,j,count[200]; 

    #pragma omp parallel for 
    for(i=0;i<200;i++){ 
     count[i] = 0; 
     for (j=0;j<200;j++){ 
      if (j!=i){ 
       count[i]++; 
       printf("i: %d j: %d count[i]:%d, count[i]-j:%d\n",i,j,count[i], count[i]-j); 
      } 
     } 

    } 

    return 0; 
} 

이 결과를 보면 카운트 값 [I] 루프 만 [I]를 -j 0 일 수 중 200 카운트 1에서 이동하더라도, 200 초과의 일부 1 또는 -1이지만 각 스레드가 i의 한 값에서 작동한다고해도 값이 크게 다르며 카운트 배열은 i의 현재 값에만 의존합니다. 카운트를 안전하게 늘릴 수 있도록 코드를 어떻게 다시 작성합니까?

+0

최종 값은 무엇입니까? 모든 값을 인쇄하려면이 후 단일 루프를 추가 할 수 있습니까? –

+0

두 번째 루프 앞에 '#pragma omp parallel'을 넣으십시오. – purplepsycho

+0

@purplepsycho가 잘못되었으므로'count [i]'에 경쟁 조건이 생성됩니다. – Zulan

답변

1

j으로 지정하고으로 선언해야합니다. 당신은을 통해 이렇게 명시 적으로 수행 할 수

#pragma omp parallel for private(j) 

i이 작업 공유 루프의 루프 변수 인 암시 개인입니다. count은 암시 적으로 공유이므로 루프 외부에 정의되어 있기 때문입니다. 둘 다 여기에 바람직합니다.

그러나 특히 은 항상 OpenMP를 사용할 때 항상 변수를 가능한 로컬로 선언하는 것이 좋습니다. 이렇게하면 내재적 인 개인/이 거의 항상 맞으며 미묘한 정의되지 않은 값 읽기를 피할 수 있습니다. 그것은 일반적으로 BTW 좋은 연습

int count[200]; 

#pragma omp parallel for 
for(int i=0;i<200;i++){ 
    count[i] = 0; 
    for (int j=0;j<200;j++){ 

입니다 : count[i]-j의 출력물이 완전히 임의의 값을 표시 할 수 있습니다. 잠재적으로 다른 스레드가 작성한 데이터에 액세스합니다.

관련 문제