2017-11-19 3 views
-2

병렬화의 OpenMP를 사용 :C++ 코드 나는 아래의 OpenMP를 사용하여 내 C++ 코드를 병렬 근래

....//some code 
    double S_theta = 0.0, S_x = 0.0, S_y = 0.0; 
#pragma omp parallel for private(dx,dy,theta_new) reduction(+ : S_x,S_y,S_theta) 
    for(int j = 0; j < N; j++) 
     { 
     if (j==i) continue; 
      double delta_x = x[i]-x[j], 

     for(int ky = -1; ky<= 1; ky++) 
      { 
      for(int kx = -1; kx<= 1; kx++) 
       { 

       if (r_ij_square > l0_two) 
        { 
        double r_ij = sqrt(r_ij_square); 
        r_x_ij/= r_ij; 
        r_y_ij/= r_ij; 
        double rdote = r_x_ij * e_x[j] + r_y_ij * e_y[j]; 
        S_theta += e_dot_e * (e_cross_e - rdote * (e_x[i] * r_y_ij - e_y[i] * r_x_ij))/(r_ij_square * r_ij); 
        double S = rdote /r_ij_square; 
        S_x += r_x_ij * S; 
        S_y += r_y_ij * S; 
        } 
       } 
     } 

    double zeta = -eta/2.0 ; 
    theta_new[i] += zeta + dt * dlthet; 
    } 
    ....//some code 

하지만 결과는 내가 그것을 실행할 때마다 변경을! 이 줄을 제거하면

#pragma omp parallel for reduction(+ : S_x,S_y,S_theta) 

결과가 다른 실행에서 동일합니다. 내 코드에 어떤 문제가 있습니까?

+0

'S'란 무엇입니까? 'S_x','S_y','S_theta'가 제대로 초기화되어 있습니까? – 1201ProgramAlarm

+0

나는 그들을 지금 추가했다. @ 1201ProgramAlarm –

+0

'}'를 놓치지 않았다면, 들여 쓰기가 매우 잘못된 것이다. 먼저 수정하십시오. –

답변

0

변수 S은 루프 외부에서 선언되며 루프를 실행하는 모든 스레드간에 공유됩니다. 사용 방법을 감안할 때 루프 내부에 double S = rdote/r_ij_square;으로 선언 할 수 있습니다.

+0

문제가 해결되지 않습니다. 여전히 출력이 다르다 –

+0

@ mathemamathema 끝 부분의 값과 동일한 문제가있는 것처럼 보입니다 :'dx [i]','dy [i]','theta_new [i]' 'j' 루프. – 1201ProgramAlarm

+0

당신은 맞습니다.하지만 나는 j 루프 안에 정의 할 수 없습니다. –