병렬프로그램의 자료경합을 탐지하기 위해 논리적 병행 (logical concurrency)을 정확하게 판단하는 것은 매우 중요하다. 그러나 OpenMP 프로그램을 위한 동적 경합탐지도구인 RaceStand는 논리적 병행성 정보를 판단하기 위해 잘못된 정적 감시코드삽입(static instrumentation)으로 인해 함수 호출(function call)에 따른 내포된 fork-join 병렬성을 지원하지 않는다. 그러므로 RaceStand는 언제 어디에서 함수가 호출되는지 예측하지 못하여 결국 많은 false positives를 생성할 수 있다. 본 논문에서는 OpenMP 프로그램의 병렬 스레드 사이의 논리적 병행성 정보의 판단을 돕는 동적 이진 감시코드삽입(dynamic binary instrumentation) 기법인 Labelinst를 제시한다. 이 기법은 “parallel for”와 같은 OpenMP의 디렉티브(directives)들을 감시하고 타겟 프로그램에 레이블링(labeling) 루틴을 호출하는 감시코드들을 동적으로 삽입하며, 스레드 연산을 감시함으로써 스레드들의 시작지점과 종료지점을 판단하여 정확한 레이블 생성이 가능하게 한다. 제시된 기법은 Pin 소프트웨어 프레임위크 상에 Labelinst라는 도구로 구현하였고, RaceStand와 도구의 정확성을 실험적으로 비교하였다. 실험을 위해서 OpenMP 합성 프로그램을 개발하였고, OmpSCR 벤치마크들 중 함수호출에 의해 내포병렬성을 고려하여 두 개의 응용 프로그램을 선택하였다. 실험된 결과에서 Labelinst는 모든 프로그램에 대해 항상 정확한 레이블을 생성하는 반면 RaceStand는 예측된 바와 같이 함수 호출에 의해 내포병렬성이 존재하는 프로그램에서 부정확한 결과를 생성함을 보였다. 이러한 결과는 제안하는 기법이 OpenMP와 같은 병렬 프로그램에서 자료경합 탐지를 위한 정확한 감시코드 삽입이 가능한 기술임을 나타낸다.
Accurately determining logical concurrency is important for detecting data races in parallel programs.However, RaceStand, a dynamic race detection tool for OpenMP programs, does not support function calls due to its defective source code instrumentation. Thus, RaceStand fails to correctly determine the logical concurrency for OpenMP programs with fork-join parallelism caused by function calls. This finally causes RaceStand to produce many false positives, because it cannot predict when and where functions will be called. This thesis presents a dynamic binary instrumentation technique that helps determine the logical concurrency between parallel threads of OpenMP programs. The technique monitors OpenMP directives, such as ``parallel for", and dynamically inserts monitoring codes which call to labeling routines into the target program. Similarly, thread operations are monitored to find the start and end points of active threads where the monitoring codes will be inserted. We implemented our technique as a tool, called Labelinst, on top of the Pin instrumentation framework, and empirically compared the correctness of Labelinst with RaceStand. For the comparison, we developed a set of synthetic OpenMP programs and also chose two real-world applications from the OmpSCR benchmark considering nested fork-join parallelism caused by function calls. The empirical results show that Labelinst can always create correct labels for all the programs, whereas RaceStand produce incorrect output results for programs with fork-join parallelism casued by function calls. This makes that our technique is a precise and accurate instrumentation technique for detecting data races in parallel programs, such as OpenMP programs.