스파이크 뉴런 네트워크에서 일부 시뮬레이션을 실행하는 코드를 병렬 처리하려고합니다. 여기에는 하나의 더블 루프가 관련되어 있는데, 여기서 '#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의 현재 값에만 의존합니다. 카운트를 안전하게 늘릴 수 있도록 코드를 어떻게 다시 작성합니까?
최종 값은 무엇입니까? 모든 값을 인쇄하려면이 후 단일 루프를 추가 할 수 있습니까? –
두 번째 루프 앞에 '#pragma omp parallel'을 넣으십시오. – purplepsycho
@purplepsycho가 잘못되었으므로'count [i]'에 경쟁 조건이 생성됩니다. – Zulan