2014-03-12 5 views
0

) 스레드 ID를 기반으로 각 스레드가 자체 변수 세트를 갖는 병렬 (예 : 정적/동적/안내) for-loop를 실행하려고합니다. 병렬 pragma 내에서 선언 된 변수는 private이지만, for 루프의 모든 반복에서 변수를 다시 선언하고 싶지는 않습니다.C에서 스케쥴링을위한 OpenMP 병렬 (

내 특정 상황에서, 좌표를 생성하는 집합이 pi를 근사화하는 원의 내부 또는 외부에있을 때마다 계산됩니다. 각각의 스레드에서 이러한 좌표를 생성하기 위해 erand48 (int [3] seed)를 사용하고 각 스레드에 'seed'에 대한 다른 값 집합을 제공함으로써 더 다양한 숫자를 사용하여 근사 (및 또한이 시뮬레이션에 대한 요구 사항).

long long int global_result = 0; 
    int tID = omp_get_thread_num(); 
    int[3] seed; 
    seed[0] = (((tid*tid + 15) * 3)/7); 
    seed[1] = ((((tid + tid) * 44)/3) + 2); 
    seed[2] = tid; 
    int this_result = 0; 
# pragma omp parallel for num_threads(thread_count) schedule(runtime) 
     for(i = 0; i < chunksize; i++){ 
     x = erand48(seed); 
     y = erand48(seed); 
     ((x*x+y*y)>=1)?(this_result++):;  
     } 
# pragma omp critical{ 
     global_result+= this_result; 
    } 

이것은 내가하려는 일을 나타낼 수있는 최선의 방법입니다. 'this_result', 'tid'및 'seed'의 값을 개인 범위로 지정하고 싶습니다.

답변

1

나는 병렬 프라그 내에서 선언 된 변수는 개인 것을 알고,하지만 난 루프에 대한 모든 반복에서 변수를 다시 선언하고 싶지 않아요.

#pragma omp parallel을 두 개의 개별 구성 요소 #pragma omp parallel 및 #pragma omp for로 분리합니다. 그런 다음 로컬 변수를 병렬이지만 루프 외부에 선언 할 수 있습니다. 이

int global_result = 0; 
#pragma omp parallel reduction(+:global_result) 
{ 
    int tid = omp_get_thread_num(); 
    int seed = (((tid*tid + 15) * 3)/7); 
// Typo, as commented below 
// # pragma omp parallel for schedule(runtime) 
// What is intended! 
# pragma omp for schedule(runtime) 
     for(i = 0; i < chunksize; i++){ 
     float x = erand48(&seed); 
     float y = erand48(&seed); 
     if ((x*x+y*y)>=1) 
      this_result++;  
     } 
     global_result += this_result; 
} 

파이를 계산하는 더 나은 방법이 있습니다 같은 뭔가, 내가 외부의 이러한 변수를 설정하는 방법 :-)

+0

해당 할당. 차라리 시리즈를 계산할 것입니다. 그래도 내 문제는 해결됩니다. –

+0

내부 pragma에는 'parallel'이 없어야합니다. –

+0

당신은 물론 맞습니다! 두뇌 방귀 입력 코드를 웹 "편집기"에 입력하십시오 :-) –

1

당신은 그런 당신의 #pragma 지시어에 "개인"절을 사용할 수 있습니다

#pragma omp parallel for private(this_result, tid, seed) num_threads(thread_count) schedule(runtime) 

내가 제대로 질문을 이해하면 그런 짓을해야합니다.

+0

비록에 대한 루프 그들의 thread_ID 년대에 따라 다른 값을 가질 수 있도록 ? –

+0

루프 외부에있는 경우 비 병렬 섹션에서 단 하나의 스레드 (기본 스레드)가 있습니다. 따라서 스레드 ID를 기준으로 값을 할당 할 수 없습니다. 당신이 할 수있는 한 가지는 "seed"를 int [thread_count] seed로 설정하고이 벡터의 각 위치에 숫자를 할당하는 것입니다. 루프 내에서 시드 [omp_get_thread_num()]에 액세스하여 각 스레드가 자신의 배열 위치에만 액세스 할 수 있도록합니다 (개인용 인 경우처럼). – user3407000