2015-10-08 4 views
3

Рассмотрим следующий пример:Могу ли я использовать фильтр нитей для программ OpenMP?

#include <iostream> 

int main() { 
    int i = 0; 
    #pragma omp parallel 
    { 
     #pragma omp critical 
     { 
      ++i; 
     } 
    } 
    std::cout << i; 
} 

Сборка с g++ -fopenmp -fsanitize=thread и работает выходами

ВНИМАНИЕ: ThreadSanitizer: гонки данных (PID = 9576)
Read размером 4 на 0x7ffdc170f600 с помощью резьбы T1:
# 0 main._omp_fn.0 (a.out + 0x000000400d20)
# 1 gomp_thread_start /build/gcc/src/gcc-5.2.0/libgomp/team.c:118 (libgomp.so.1 + 0x00000000f42d)

Предыдущая запись размером 4 на 0x7ffdc170f600 с помощью резьбы T2:
# 0 main._omp_fn.0 (a.out + 0x000000400d35)
# 1 gomp_thread_start /build/gcc/src/gcc-5.2.0/libgomp/ team.c: 118 (libgomp.so.1 + 0x00000000f42d)

Местоположение представляет собой стек основной нити.

Т1 нить (TID = 9578, бег), созданный в основном потоке:
# 0 pthread_create /build/gcc/src/gcc-5.2.0/libsanitizer/tsan/tsan_interceptors.cc:895 (libtsan.so 0,0 + 0x000000027a37)
# 1 gomp_team_start /build/gcc/src/gcc-5.2.0/libgomp/team.c:796 (libgomp.so.1 + 0x00000000f98f)
# 2 __libc_start_main (libc.so.6 + 0x00000002060f)

резьба Т2 (TID = 9579, бег), созданная в основном потоке:
# 0 pthread_create /build/gcc/src/gcc-5.2.0/libsanitizer/tsan/tsan_interceptors.cc:895 (libtsan.so.0 + 0x000000027a37)
# 1 gomp_team_start /build/gcc/src/gcc-5.2.0/libgomp/team.c:796 (libgomp.so.1 + 0x00000000f98f)
# 2 __libc_start_main (libc.so.6 + 0x00000002060f)

РЕЗЮМЕ: ThreadSanitizer: гонки данных ??: 0 main._omp_fn.0

насколько я могу видеть, что это ложное срабатывание. Есть ли способ избежать этого?

(что-то работает с лязгом и libomp бы тоже хорошо.)

+0

Вы должны были бы построить библиотеку OpenMP выполнения с Цан, а если вы хотите, чтобы проанализировать код; в противном случае добавить подавление? –

+0

@ KerrekSB Я боялся, что это единственный ответ. Создание современного материала на моей рабочей машине Ubuntu 12.04 и получение его на работу не очень весело. –

+0

@KerrekSB Можете ли вы рассказать о материалах подавления? Нужно ли мне делать это за каждый ложный хит? В нашем производственном коде есть много, и если я должен проверить их все «вручную», то дезинфицирующее средство теряет смысл. –

ответ

3

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

Мы работали над временем выполнения OpenMP, чтобы Tsan понимал эти точки синхронизации и удалял все ложные срабатывания.

Посмотрите на этот проект:

https://github.com/PRUNER/archer

Позвольте мне знать, если вам нужна дополнительная помощь.

Бест,

Simone

+0

Спасибо, я проверю это, когда я Получить шанс. Может быть немного, хотя я сейчас работаю над чем-то другим, а коллега делает вещи для дезинфицирующих средств. –

Смежные вопросы