2012-02-13 2 views
2

왜 OpenMP를 나에게이 오류 줄 않습니다 -의 OpenMP는

오류 : 전에 예상 문 '{'토큰

#include <stdio.h> 
#include <stdlib.h> 
#include <omp.h> 
#include <unistd.h> 

int main (int argc, char *argv[]) 
{ 

#pragma omp parallel 
{ 

int a[100],b[100],c[100]; 
int i =0; 

    for(; i < 100; i++){ 
    a[i] = i; 
    b[i] = i; 
    } 

    #pragma omp parallel for schedule(static,5) 
    { 
    int i = 0; 
     for(; i < 100 ; i++){ // this is the for loop that is referred in the error message 
    c[i] = a[i] + b[i]; 
    } 

    } 

} 

printf("Outside parallel block \n"); 

} 

답변

1

그렇게

int i; 
#pragma omp parallel for schedule(static,5) 
for (i=0;... 
+0

나는 이것을 생각 해왔다. 내 우려는, 'i'가 각 스레드마다 개별 스레드 대신 다른 스레드에 대한 공유 변수가되는 경우입니다. 같은 변수에 쓰는 스레드가 다르기 때문에 결과가 엉망이됩니까? – r3x

+0

@julianromera 예. 이 대답은 올바른 것으로하기 위해서 '사적 (i)'이라고 기술 할 필요가있다. – NoseKnowsAll

5

먼저 수행을, 두 번째 OpenMP pragma에는 "parallel"이 없어야합니다. 이미 병렬 블록을 열었 으면 이제 for 루프의 작업을 공유해야합니다.

두 번째로 일반 블록을 묶는 데 병렬을 사용할 수 없습니다. for 루프 여야합니다. 당신이 정말로 위에 사용 된 것보다 다른 i을 원하는 경우, 수행

#pragma omp for schedule(static,5) 
for (int i=0; i < 100; i++) 
{ 
    c[i] = a[i] + b[i]; 
} 
2

이 내가이 일의 중복 실현하기 전에 내가 this 질문에 게시 대답이다. 어쨌든 여기에 이미 주어진 답변을 확대하면, 나는 그것을 다시 작성하고 있습니다.

parallel for은 결합 된 지시문입니다. 이는 하나의 지시문에 parallelfor을 결합하여 공간을 절약 할 수 있습니다. for 지침의 구문 즉시 것을 요구하므로

#pragma omp parallel for shared(sum) private(i,j,k) ... 

기본적 (도 for 지시에 기인 할 수 private 절)

#pragma omp parallel shared(sum) private(i,j,k) 
{ 
    #pragma omp for 
    ... 
} 

속기 표시법

다음에 for -loop을 입력하면 동일한 구문 요구 사항이 parallel for 지시문에 적용됩니다. 블록이 에러 인 내부

#pragma omp parallel for ... 
for (...) 
{ 
    ... 
} 

for -loop을 갖는 즉, ... 위에서 만 관련 (블록) 본체와 for -loop 수있다. 블록 내부에 전체 병렬 영역이있는 것은 아닙니다. 다음은 완벽하게 유효한 구문입니다.

{ 
    #pragma omp parallel for ... 
    for (...) 
    { 
     ... 
    } 
} 
관련 문제