programing

헬그랜드(발그랜드)와 OpenMP(C): 잘못된 긍정을 피합니까?

powerit 2023. 7. 22. 10:31
반응형

헬그랜드(발그랜드)와 OpenMP(C): 잘못된 긍정을 피합니까?

여기에서 볼 수 있는 Valgrind 스레드 오류 감지 도구 Helgrind에 대한 설명서

GCC를 사용하여 OpenMP 코드를 컴파일할 경우 GCC의 OpenMP 런타임 라이브러리(libgomp.so )는 POSIX pthreads 프리미티브 대신 원자 시스템 명령과 Linux futex 시스템 호출을 사용하기 때문에 데이터 레이스에 대한 잘못된 긍정 보고서의 혼란을 야기할 것이라고 경고합니다.하지만 GCC를 다시 컴파일하면 이 문제를 해결할 수 있다는 것을 알려줍니다.--disable-linux-futex구성 옵션.

그래서 해봤습니다.로컬 디렉토리(~/GCC_Valgrind/gcc_install)에 새로운 GCC 버전 4.7.0(이 문서 작성 시점의 최신 릴리스)을 컴파일하여 설치했습니다.--disable-linux-futex구성 옵션.그런 다음 눈에 보이는 데이터 레이스가 없는 작은 OpenMP 테스트 프로그램(test1.c)을 만들었습니다.

/* test1.c */

#include <omp.h>
#include <stdio.h>
#include <stdlib.h>

#define NUM_THREADS 2

int a[NUM_THREADS];

int main(void) {
        int i;
#pragma omp parallel num_threads(NUM_THREADS)
        {
                int tid = omp_get_thread_num();
                a[tid] = tid + 1;
        }
        for (i = 0; i < NUM_THREADS; i++)
                printf("%d ", a[i]);
        printf("\n");
        return EXIT_SUCCESS;
}

저는 이 프로그램을 다음과 같이 컴파일했습니다.

~/GCC_Valgrind/gcc_install/bin/gcc -Wall -fopenmp  -static -L~/GCC_Valgrind/gcc_install/lib64 -L~/GCC_Valgrind/gcc_install/lib -o test1 test1.c

하지만, 저는 30개의 거짓 긍정 데이터 레이스 보고서를 받았습니다!--모두 libgomp 코드에서 발생합니다.그런 다음 테스트 1.c를 컴파일했습니다.-static깃발을 들고 헬그린드를 다시 달았습니다.이번에, 저는 단지 9개의 거짓 긍정적인 데이터 레이스 보고서를 받았지만, 그것은 여전히 너무 많습니다. 그리고, 그것 없이.-static플래그, libgomp 코드에서 추정되는 인종을 추적할 수 없습니다.

GCC로 컴파일된 OpenMP 프로그램에 적용되는 Helgrind의 거짓 긍정 데이터 레이스 보고서의 수를 줄이는 방법을 찾은 사람이 있습니까?감사합니다!

댓글에 가깝기 때문에 답변으로 드려서 죄송합니다만, 댓글로 끼우기에는 너무 길어서 다음과 같습니다.

참조한 사이트에서.

GNU OpenMP(GCC의 일부)를 위한 런타임 지원 라이브러리(GCC 버전 4.2 및 4.3 이상).GNU OpenMP 런타임 라이브러리(libgomp.so )는 원자 메모리 명령어와 푸텍스 syscall의 조합을 사용하여 자체 동기화 프리미티브를 구성합니다. 이는 Helgrind에서 볼 수 없기 때문에 완전한 혼란을 야기합니다.

다행히 이 문제는 구성 시간 옵션(GCC용)을 사용하여 해결할 수 있습니다.소스에서 GCC를 재구성하고 --disable-linux-futex를 사용하여 구성합니다.따라서 libgomp.so 은 대신 표준 POSIX 스레드 프리미티브를 사용합니다.이 버전은 GCC 4.2.3을 사용하여 테스트되었으며 최신 GCC 버전을 사용하여 다시 테스트되지 않았습니다.최신 버전의 성공 또는 실패에 대해 들어주시면 감사하겠습니다.

당신이 당신의 게시물에서 언급했듯이, 이것은 관련이 있습니다.libgomp.so하지만 그것은 공유 객체이기 때문에 -static 플래그를 전달하고 라이브러리를 계속 사용할 수 있는 방법을 모르겠습니다.제가 잘못 알고 있는 건가요?

작동하는 단계:

  1. 다음사 용여하 gcc (libgomp 포함다일컴)를 사용하여 포함)를 다시 --disable-linux-futex
  2. 프로그램을 컴파일할 때 futex free gcc를 사용해야 합니다.
  3. 할 때 는 보통 futex free libgomp에 ).GCC-OBJ-DIR/PLATFORM/libgomp/.libs를 들어 )를 예를 들어 다음과 같이 설정합니다.LD_LIBRARY_PATH환경 변수:

내보내기 LD_LIBRARY_PATH=~/gcc-4.8.1-nofutex/x86_64-unknown-linux-gnu/libgomp/.libs:

또한 주의하십시오, 만약에omp_set_lock 코드에서 됩니다.omp.h잠금 구조 크기가 다르기 때문에 경로를 대체해야 합니다.https://xrunhprof.wordpress.com/2018/08/27/tsan-with-openmp/ 을 참조하십시오.

언급URL : https://stackoverflow.com/questions/10641972/helgrind-valgrind-and-openmp-c-avoiding-false-positives

반응형