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을 참조하십시오.)
이 C++ 98 또는 C++ 11입니까? – user1071136
C++ 11 답변은 괜찮습니다 –
그런데 왜 원자 분이 더 빠릅니까? 나는 reduction-min이 성능을 향상시키지 않는 비슷한 문제가 있었기 때문에 아마도 원자 분을 시도해야 할 것입니다. – user1071136