다음 직렬 함수를 고려하십시오. 코드를 병렬 처리하면 모든 스레드가 병렬 영역 (이 기능은 표시되지 않음)에서이 함수를 호출합니다. 나는이 threadsafe를 효율적으로 (빠른) 과으로 만들려고 노력하고있다.C++ OpenMP critical : "단방향"잠금?
float get_stored_value__or__calculate_if_does_not_yet_exist(int A)
{
static std::map<int, float> my_map;
std::map::iterator it_find = my_map.find(A); //many threads do this often.
bool found_A = it_find != my_map.end();
if (found_A)
{
return it_find->second;
}
else
{
float result_for_A = calculate_value(A); //should only be done once, really.
my_map[A] = result_for_A;
return result_for_A;
}
}
이 기능은 스레드가 성공적으로 (그것이 무엇이든) 자신의 "A"에 대한 저장된 값을 "발견"것이라고 거의 매번. 새 A가 호출 될 때마다 값을 계산하고 저장해야합니다.
그럼 #pragma omp critical
은 어디에 넣어야합니까? 각 스레드는 지속적으로이 일을하기 때문에
이 용이하지만, 그것은이 모든 주위에 #pragma omp critical
을 넣어 매우 비효율적 이며 종종 읽기 전용 케이스가 될 것입니다.
"편도"critical
또는 "편도"lock
루틴을 구현할 수있는 방법이 있습니까? 즉, 반복자와 관련된 위의 연산은 else
문에서 my_map
에 쓸 때만 "잠겨"있어야합니다. 그러나 다중 스레드는 .find
호출을 동시에 실행할 수 있어야합니다.
나는 이해할 수 있기를 바랍니다. 감사합니다.
나보다 낫다 그러나'critical'의 사용은 내가 걱정했던 비 효율성이다 - 때문에'critical'에 여러 개의 스레드가 simlutaneously지도를 읽을 수 없습니다. – cmo
'원자'는 좋은 생각입니다. 그렇다면 필자는 쓰기 영역 주위에'atomic'과'flush'를 넣기 만하면됩니까? - 읽기 영역은 지시가 필요합니까? – cmo
@CycoMatto 알아요. 나는 내가 원자와 플러시로 영리한 것을했고, 실수를 깨달았으며, 나의 대답을 편집했다고 생각했다. 문제를 일으키는 다른 사람에게 유용 할 수있는 정보를 제공하지만, 원하는 경우 잠긴 경우 쓰기 동작을 제공하지 않습니다. –