LINUX.ORG.RU

Инструмент для обнаружения гонки данных?

 , , ,


4

1

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

А теперь как мне проверить что это правильно работает?;-)

Ну то есть понятно, что я могу запустить последовательную версию и сравнить ее результаты с параллельной. Но может есть какая то хитрая утилита которая сразу ткнет меня носом - вот тут конфликт между потоками?

★★★★★

Но может есть какая то хитрая утилита которая сразу ткнет меня носом - вот тут конфликт между потоками?

Тебе в рантайме или статически?

utf8nowhere ★★★
()

Это решается через формальные методы, например вот https://dev.by/news/marsokod-ili-kak-sozdavalos-po-dlya-marsohoda-curiosity

Инструмент Spin для проверки моделей специально предназначен для верификации программ, работающих в распределенных системах и имеющих множество потоков выполнения. Его внутренний проверочный алгоритм основан на методе формальной верификации с применением конечных автоматов, сформулированном Варди и Вольпером. Неформально Spin играет роль фонового планировщика процессов и пытается найти такие варианты выполнения кода в системе, которые нарушают требования, заданные пользователем. Простые примеры типов требований, выполнение которых может быть доказано или опровергнуто таким способом — допустимость программных утверждений и отсутствие сценариев, приводящих к возникновению взаимных блокировок. Но возможности программы для проверки моделей этим далеко не ограничиваются. Инструмент может верифицировать осуществимость или неосуществимость значительно более сложных требований, которые могут быть выражены средствами линейной темпоральной логики.

Но формальная верификация это сложно и дорого. А так я могу посоветовать прогнать через https://valgrind.org/docs/manual/drd-manual.html и воспользоваться статическими анализаторами. Про санитайзеры тут уже выше упоминали

SZT ★★★★★
()
Ответ на: комментарий от SZT

Кстати, упомянутый в цитате Spin является опенсорсным, его можно скачать и попробовать им что-то доказать. Только он не для плюсов, он для Си. https://spinroot.com/spin/whatispin.html

SZT ★★★★★
()

Переписать на расте

Minona ★★☆
()

А теперь как мне проверить что это правильно работает?;-)

Самый лучший способ - это доказать (как доказывают теоремы в математике). Ни один из runtime checker-ов (valgrind, sanitizers) не могут доказать отсутствие ошибок, они лишь могут указать на проблемы, которые воспроизведутся в конкретном случае.

Иными словами, стоит написать так, чтобы было очевидно отсутствие ошибок. Стоит быть крайне осторожным с

я хитро извернулся

поскольку такое обычно плохо поддается пониманию коллегами и самим собой спустя некоторое время.

kawaii_neko ★★★★
()
Ответ на: комментарий от kawaii_neko

такое обычно плохо поддается пониманию коллегами и самим собой спустя некоторое время.

Для достижения высокой производительности в наших задачах такое увы скорее правило чем исключение.

AntonI ★★★★★
() автор топика

Зачем мьютексы в OpenMP?? OpenMP и мьютексы - это у вас перебор какой-то. Вы уж или в OpenMP досконально разберитесь или уже сами городите мьютексы для синхронизации ваших потоков.

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

gvtlor
()
Ответ на: комментарий от AntonI

Я в курсе, что есть set_lock и unset_lock, но суть в том, что может все таки воспользоваться task, например, (я не знаю, что за задача и как ее реализовывали, может еще какие-то конструкции из openmp взять), прежде чем бросаться и вручную реализовывать синхронизацию доступа к данным. Почему бы эту задачу не отдать на откуп OpenMP, собственно и для этого тоже он и задумывался.

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

gvtlor
()

Если речь про кластер, то насколько я знаю - никак. Только сети Петри и вот это вот все. Но, можно схитрить и охладить все в одном бинарнике, тогда, по идее может и hellgrind сработать.

pon4ik ★★★★★
()
Последнее исправление: pon4ik (всего исправлений: 1)
Ответ на: комментарий от pon4ik

Речь идёт о запуске на одном узле кластера, но там 56 потоков. Но меня устроит и тест на ноуте в 4 потока

AntonI ★★★★★
() автор топика
Ответ на: комментарий от gvtlor

А может все таки проще не давать советов по задаче которой ты не знаешь и о которых Вас не просили?:-)

AntonI ★★★★★
() автор топика
Ответ на: комментарий от AntonI

Может проще все таки ознакомиться с технологией программирования, прежде чем приступать к задаче. См. например. Intel Thread Checker (или Intel Inspector). Может быть здесь еще что-то окажется полезным. https://en.wikipedia.org/wiki/Race_condition#Tools

gvtlor
()

ThreadSanitizer просто прекрасно ловит такие проблемы, будь то pthreads или что-то что использует это под капотом

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от AntonI

У ThreadSanitizer есть ограничения. Далеко не все типы блокировок оно поддерживает, нужно читать доки. Если OpenMP использует что-то неподдерживаемое то пролетели, а если pthread mutex то тогда годится

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Спасибо.

Сейчас у меня правда период отладки олнопоточной части, а с сб. двухнедельный горнолыжный запой и сыроедение. Вернусь - продолжу:-)

AntonI ★★★★★
() автор топика

Корректность многопоточного софта практически невозможно доказать численными методами. Ибо космическое число вариантов исполнения. А вот аналитически уже реально. Рекомендую следовать советам [url=«https://www.linux.org.ru/forum/development/15446804?cid=15447993»]kawaii_neko[/url]

(разметку сломали?)

dvetutnev
()
Последнее исправление: dvetutnev (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.