2011-04-14 5 views
1

Pthread와 OpenMP를 모두 사용하는 프로그램이 있습니다. 기본적으로 Pthread를 사용하여 2 개의 스레드 (스레드 A와 B)가 만들어지고 스레드 A에서는 OpenMP가 for 루프를 병렬화하는 데 사용됩니다.OpenMP 및 Pthreads에서 잠금 사용

OpenMP 스레드와 스레드 B에서 액세스하는 전역 변수가있는 경우 OpenMP에서 잠금을 사용하여 경쟁 조건이 없는지 확인할 수 있습니까?

내가 마음에 무엇을 가지고 :

int count = 0; 

pthread_create(&ThreadA, &attr, WorkA, NULL); 
pthread_create(&ThreadB, &attr, WorkB, NULL); 

void *WorkA (void *t) 
{ 
    #pragma omp parallel for 
    for (i = 0 ; i < N ; i++) 
    { 
     // Do some work 
     #pragma omp critical 
     { 
     // Do some other work 
     OMP_SET_LOCK(&lock); 
     count++; 
     OMP_UNSET_LOCK(&lock); 
     } 
    } 
} 

void *WorkB (void *t) 
{ 
    if (count > 0) 
    { 
     OMP_SET_LOCK(&lock); 
     count--; 
     OMP_UNSET_LOCK(&lock); 
     // Do some work 
    } 
} 

감사합니다.

답변

1

OpenMP 구현에 따라 기본 코드에서 pthread를 잘 사용할 수 있습니다. 즉, OpenMP 사양은 다른 스레딩 모델이 "함께 훌륭하게"재생되는지 여부에 대해 아무 것도 말하지 않습니다. 이것은 사용중인 구현이 허용 한 작업을 수행했는지 여부에 따라 작동하거나 작동하지 않을 수 있습니다. 불행하게도, 내가 말할 수있는 것은 사용중인 제품의 문서를 확인하고 그것이 무엇인지 말하고 있는지 확인하는 것입니다. 나는 대부분의 구현이 이것을 가능하게하려고 노력했다고 믿는다.

1

개수를 변경하려면 원자 연산을 사용하십시오. 첫째, 뮤텍스를 사용하여 간단한 ++ 또는 -를 보호하는 것은 불필요합니다. 뮤텍스는 어떤 방식 으로든 원자 적으로 수행 할 수없는 것을 보호하기위한 것입니다. 둘째로, 내 마음 속에서, 퍼포먼스 = 1/((잠금)^5). 나는. 잠금은 스레드 된 응용 프로그램의 성능 문제의 근원이되므로 피하십시오. 셋째 ... 원자 연산은 OpenMP와 잘 어울립니다. 카운트를 변경하려면 __sync_add_and_fetch 또는 이와 유사한 원자 적 조작을 사용하십시오. 칩의 하드웨어로 구현되었으므로 ++ 또는 -보다 느린 속도가 약 2 배 정도이며, 뮤텍스를 사용할 때는 약 40 배 정도 느립니다.