2014-02-19 2 views
1

다른 for 루프 내 for 루프를 병렬 처리하고 싶습니다. 필자는 단순히 "#pragma omp parallel for"명령을 내부 루프에서 직접 사용할 수 있지만 매번 새로운 세트의 스레드를 생성하는 것은 불가능한 일이 아닌가하는 두려움이 있습니다. 외부 루프 (내부 루프 이전)에는 할당 및 단일 스레드에서 수행해야 할 다른 명령어가 있습니다 (내부 루프에서 공유 할 수 있도록 매트릭스를 할당하므로 모든 스레드가 액세스 할 수 있어야합니다). 나는 다음과 같이하려고 시도했다 :Openmp : 중첩 된 루프 및 할당

 #pragma omp parallel 
     { 
     for (auto t=1;t<=time_step;++t){ 
     #pragma omp single { 
     Matrix<unsigned int> newField(rows,cols); 
     //some instructions 
     } 
     unsigned int j; 
     #pragma omp for 
     for (unsigned int i = 2;i<=rows-1;++i){ 

      for (j = 1;j<=cols;++j){ 
          //Work on NewField (i,j) 
      } 
     } 
     #pragma omp single { 
      //Instruction 
      } 
     } 
    } 

이 코드는 작동하지 않는다. 매번 스레드를 생성하는 것보다 (작업하게 만들면)이 방법이 더 효율적입니까? 내가 뭘 잘못하고 있니?

감사합니다.

+0

외부 루프를 t 이상으로 병렬화하지 않는 이유는 무엇입니까? 매 단계마다 새로운 행렬을 생성한다면 각 스레드는 행렬의 비공개 버전에 쓸 것입니다. –

+0

코드가 작동하지 않는다는 것은 무엇을 의미합니까? 구문 오류가 발생합니까? –

+0

'single' 대신'#pragma omp master'를 사용할 것입니다. 그런 식으로 스레드는 코드를 실행하는 코드를 협상 할 필요가 없습니다. –

답변

0

코드 작성 방법에 구문 오류가 발생할 수 있습니다. single 또는 critical과 같은 OpenMP 지정 문을 사용할 때 중괄호는 새 행에 있어야합니다.

그래서 대신

#pragma omp single { 

} 

의 당신은 OpenMP를이

#pragma omp single 
{ 

} 
1

많은 구현을 할 필요가 모든 병렬 지역 이전을 만드는 대신 스레드의 풀을 유지하고 있습니다.

그래서 당신은

for (auto t=1;t<=time_step;++t){ 
    Matrix<unsigned int> newField(rows,cols); 
    //some instructions 
    unsigned int j; 
    #pragma omp parallel for 
    for (unsigned int i = 2;i<=rows-1;++i){ 
     for (j = 1;j<=cols;++j){ 
      //Work on NewField (i,j) 
     } 
    } 
    //Instruction 
} 

으로 갈 수 있고 심지어 때문에 결석 한 지시의 빠른 수 있습니다.