2012-09-04 3 views
7

OpenMP는 C++ 11의 최소값을 지원합니까? OpenMP에 이식 가능한 방법이없는 경우 : x86 또는 amd64 기능을 사용하여 수행하는 방법이 있습니까?OpenMP를 사용하는 x86의 원자 최소값

OpenMP 사양에서 나는 C++에 대해 아무것도 찾지 못했지만 포트란 버전은이를 지원하는 것으로 보입니다. 자세한 내용은 v3.1의 2.8.5를 참조하십시오. , < <, 또는 >> |, /, &,^- C를 들어 ++는

binop는 +, *, 중 하나입니다 상태.

하지만 포트란 것이

intrinsic_procedure_name가 MAX, MIN, 내려서, IOR, 또는 IEOR 중 하나입니다 상태.

이 경우 당신은 더 많은 상황에 관심이 : 나는 다음과 같은 일을 뮤텍스 무료로 방법을 찾고 있어요 :

vector<omp_lock_t>lock; 
vector<int>val; 

#pragma omp parallel 
{ 
    // ... 
    int x = ...; 
    int y = ...; 
    if(y < val[x]){ 
    omp_set_lock(&lock[x]); 
    if(y < val[x]) 
     val[x] = y; 
    omp_unset_lock(&lock[x]); 
    } 
} 

나는 당신이이 알고리즘을 줄이고 사용하여 최소를 계산할 수 있다는 것을 알고. 이것이 원자 적 최소 접근법을 크게 능가하는 상황이 있음을 압니다. 그러나, 나는 또한 이것이 나의 상황에있는 경우가 아니라는 것을 안다.

편집 : 내 경우에는 약간 빠른 하나의 옵션은

int x = ...; 
    int y = ...; 
    while(y < val[x]) 
    val[x] = y; 

하지만 그 어떤 원자 작동하지 않습니다.

모든 최신 GPU에는이 기능이 있으며 CPU에서이 기능이 누락되었습니다. (OpenCL의 경우 atom_min을 참조하십시오.)

+0

이 C++ 98 또는 C++ 11입니까? – user1071136

+0

C++ 11 답변은 괜찮습니다 –

+0

그런데 왜 원자 분이 더 빠릅니까? 나는 reduction-min이 성능을 향상시키지 않는 비슷한 문제가 있었기 때문에 아마도 원자 분을 시도해야 할 것입니다. – user1071136

답변

4

C++ 용 OpenMP 사양에는 최소한의 원자량에 대한 지원이 없습니다. 또한 C++ 11도 마찬가지입니다.

귀하의 알고리즘에서 x은 스레드에 관계없이 유효한 인덱스로 계산할 수 있다고 가정합니다. 알고리즘을 변경하여 각 스레드가 자신의 val 배열을 사용하고 마지막으로 인덱스를 통해 병렬 처리 할 수있는 최종 조정을 수행하도록 제안합니다. 이렇게하면 잠금 및 원자량을 완전히 피할 수 있으며 각 스레드에 대한 데이터 분리의 이점을 얻을 수 있습니다. 즉, 거짓 캐시 공유의 기회는 없습니다. 즉, 더 빠를 것입니다.