2011-01-17 2 views
3

OpenMP는 병렬 섹션 내에서 선언 된 데이터를 어떻게 처리합니까? C99 이전에 private() 절을 사용하여 스레드 로컬 데이터를 지정했습니다.OpenMP 및 C99 데이터

int i, x; 
#pragma omp parallel for private(x) 
for (i=0; i<n; i++) { 
    x=i; 
} 

이제 C99에서는 데이터와 코드를 혼합 할 수 있으므로 변수를 사용하기 직전에 변수를 선언하는 것이 좋습니다. 루프의 범위 내에서 데이터를 선언하면 스레드가 비공개로 보장됩니까? 예를 들어, 다음은 유효한가?

#pragma omp parallel for 
for (int i=0; i<n; i++) { 
    int x=i; 
} 

나는 단지의 경우 개인 (X)를 추가했지만, 내 컴파일러 객체는 (아마도 X 있기 때문에 아직 선언되지 않았습니다).

+0

Google에서 빠른 검색은 이것이 사실임을 나타냅니다. C++에는이 속성이있었습니다. –

+1

btw : C90 예제 코드에서 C99 스타일의 for for-loop를 사용하고 있습니다 ... – Christoph

+1

아마도 C99 예제도 유효한 C90입니다. ANSI C에서 복합 문 ('{...}'블록)의 시작 부분에 변수를 선언 할 수 있습니다. – Juliano

답변

3

병렬 구조 내에서 선언 된 변수를 포함하여 일부 변수에는 미리 정의 된 데이터 공유 특성이 있습니다 (예 : shared 또는 private). 그것들은 OMP3 표준의 2.9.1.1 절에 정의되어 있습니다.

이 경우 OpenMP Standard 3.0, 2.9.1.1 : (p78, 12 행) "자동 저장 기간이있는 변수는 구문 내부의 범위에서 선언되어 있습니다." 나는 항상 OpenMP에서이 방법을 사용했음을 확신한다. 예, C99 예제에서 i와 x는 비공개입니다. 다른 한편으로, x가 정적으로 선언 되었다면 공유 될 것이라고 말하는 것과 동일한 섹션을 이해합니다. 나는이 점에서 당신이 기대하는 바를 어느 정도합니다.

1

C는 for 블록 내에 항상 x의 선언이 허용됩니다. 그래서 전혀 차이가 없으므로 이전에 그렇게 했어야합니다.

실제로 차이는 i입니다. C89의 경우 for 루프 전에 선언해야합니다. 그런 다음 OMP는 루프 변수가 각 스레드에 대해 로컬이어야한다는 것을 자체적으로 "알고"있습니다.

여기 C99은 실제로 당신의 삶을 편안하게하고 코드를 명확히합니다.

+1

이 경우 실제로는 private (i)를 추가 할 필요가 없습니다. - 루프 변수는 "루프 생성자에서 암묵적으로 private으로 만들어집니다."(2.5.1, OpenMP 3 표준)를 공유 루프 변수로 사용합니다 병행해서는 아무 의미가 없다. –

+0

@Jonathan : 맞습니다. 그에 따라 대답을 수정했습니다. –