응용 프로그램의 일부 기능을 측정하는 데 걸린 시간을 확인하려고합니다. 연결된 목록을 사용하여 메모리 내 모든 시간을 기록합니다.OMP 영역 잠금
이 과정에서 나는 목록의 끝을 추적하는 전역 변수를 도입했습니다. 새 타이밍 영역을 입력하면 목록 끝에 새 레코드가 삽입됩니다. 아주 간단한 것.
그러나 추적하고 싶은 기능 중 일부는 OpenMP 영역에서 호출됩니다. 즉, 여러 번 병렬로 호출 될 가능성이 높습니다. 그리고 이것은 내가 곤란한 곳입니다.
이것은 일반적인 Pthreads를 사용하는 경우 뮤텍스의 전역 변수에 대한 액세스를 감싸고 하루로 지정합니다. 그러나 확실하지 않습니다.이 전략은 OpenMP 지역에서 호출되는 함수에서도 여전히 작동합니까? 마찬가지로, 그들은 자물쇠를 존중합니까?
예를 들어 (컴파일,하지만 난에 걸쳐 포인트를 얻을 수 있다고 생각하지 않습니다) :
Record *head;
Record *tail;
void start_timing(char *name) {
Record *r = create_record(name);
tail->next_record = r;
tail = r;
return r;
}
int foo(void) {
Record r = start_timing("foo");
//Do something...
stop_timing(r);
}
int main(void) {
Record r = start_timing("main");
//Do something...
#pragma omp parallel for...
for (int i = 0; i < 42; i++) {
foo();
}
//Do some more...
stop_timing(r);
}
어떤 그때로 업데이트 할 것입니다 :
void start_timing(char *name) {
Record *r = create_record(name);
acquire_mutex_on_tail();
tail->next_record = r;
tail = r;
release_mutex_on_tail();
return r;
}
(사과이 명백한 해답이있는 경우 - OpenMP 프레임 워크와 멀티 스레딩 전반에 익숙하지 않습니다.)
Openmp가 pthreads (일반적으로 Linux 또는 osx의 경우)를 기반으로 작성된 경우 작동해야합니다. – tim18