Требуется ли использование -fopenmp при использовании дезинфицирующих средств для потоков в clang или gcc - PullRequest
1 голос
/ 29 апреля 2019

Я пытаюсь использовать резьбовой анализатор для данного фрагмента кода (в файле ok.c) как:

clang -fsanitize=thread ok.c -w -I../runtime

Это работает нормально, и гонки данных не обнаруживаются, но когда я пытаюсь дать опцию -fopenmpдля очистки он сбрасывает терминал с возможным расположением гонки данных в цикле.

clang -fsanitize=thread -fopenmp ok.c -w -I../runtime

Terminal output:
$
WARNING: ThreadSanitizer: data race (pid=7980)
  Atomic read of size 1 at 0x7d680001f700 by thread T2:
    #0 pthread_mutex_lock <null> (a.out+0x000000439b00)
    #1 __kmp_reap_worker <null> (libomp.so.5+0x0000000477a2)


int l_3438[10]; //shared 
int i;
            #pragma omp parallel for
            for (i = 0; i < 10; i++){
                l_3438[i] = (-10L);
            }

Я также попытался использовать атрибуты shared и private, чтобы сделать вещи более понятными.

int l_3438[10]; //shared 
int i;
            #pragma omp parallel for shared(l_3438) private(i)
            for (i = 0; i < 10; i++){
                l_3438[i] = (-10L);
            }

Вопрос: необходим ли флаг -fopenmp при использовании средства очистки потока?Спасибо.

1 Ответ

1 голос
/ 29 апреля 2019

Если вас не беспокоят ложные срабатывания (гонки данных, диагностируемые компилятором, когда их нет), я считаю, что вопрос (в том виде, в котором он опубликован) должен быть изменен.Должно было быть следующее: Должен ли я использовать средство для очистки потоков для программ openmp?

Если ваша цель состоит в том, чтобы обнаруживать гонки данных, которые могут возникнуть в результате использования конструкций openmp, то вам обязательно следует использовать средство очистки потоков с такими программами.

И если ваш вопрос действительно заключается в том, чтобы избежать ложных срабатываний при использовании средств для дезинфекции потоков с программами openmp, это рассматривается в в этом посте .

...