Инструменты для визуализации графа вызовов многопоточного приложения C ++, покрытие многопоточного кода? - PullRequest
5 голосов
/ 13 октября 2011

Я хотел бы знать, есть ли инструменты, которые могут

  • Помогите визуализировать граф вызовов большого многопоточного приложения.
  • В частности, я хочу увидеть, как несколько потоков чередуются на одном ядре / выполняются одновременно на нескольких ядрах.
  • Инструмент идеально определил бы возможные условия ожидания / тупика / гонки.
  • В конечном итоге я хочу сделать покрытие кода с точки зрения того, как потоки взаимодействуют друг с другом во время выполнения (многопоточный инструмент покрытия кода), чтобы находить потенциальные многопоточные ошибки.

    Я прошу прощения, если я не объяснил свой вопрос четко, и я хотел бы предоставить какие-либо подробности.

Ответы [ 3 ]

1 голос
/ 13 октября 2011

Хотя я не могу помочь (пока!) В большинстве ваших проблем, я думаю, что наш инструмент C ++ Test Coverage может предоставить вам данные многопоточного покрытия тестов довольно легко.

Этот инструмент использует ваш исходный код; Вы компилируете и запускаете это. Вы в конечном итоге (дешево) инструментальные зонды в вашем коде, представляющие различные блоки. Приборы записывает, какие части вашей программы выполняются, номинально как битовый вектор с одним бит на измерительный зонд. В конце выполнения (или когда вам угодно) это Битовый вектор сбрасывается, и зритель покажет его вам наложенным на код.

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

  probe[n]=true;

в логическом массиве, вы можете вместо этого реализовать

  probe[n]|=1<<threadid;

в массиве int (или что-то умное дешевле, предварительно вычислив это значение). Вероятно, для реализации потребуется всего несколько строк кода.

Люди могут заметить, что это технически проблемы с синхронизацией. Это правда, но в лучшем случае немного теряет данных покрытия, и шансы против этого довольно высоки. Большинство людей довольны "довольно хорошими" данными, а не идеальными. Если вы настаиваете на совершенстве, вы заплатите высокую цену синхронизации, используя некоторые инструкция атомарного обновления.

Мы также предоставляем вам контроль над логикой сброса зонда; Вы можете пересмотреть его, чтобы выписать данные покрытия потока (в десятках строк пользовательского диапазона кода). Средство просмотра данных о тестовом покрытии позволит вам увидеть специфичное для потока покрытие (просто выберите правильный вектор покрытия); он также имеет встроенное средство для легко вычислять / отображать пересечение / объединение / разность на векторах покрытия, что дает вам точное отношение покрытия на поток.

1 голос
/ 13 октября 2011

VTune Profiler от Intel может сделать то, что вы просите.С сайта VTune:

Блокировки и ожидания : Используйте инструменты профилирования производительности Intel®, чтобы быстро найти частую причину низкой производительности параллельных программ: слишком долгое ожидание при блокировке, пока ядранедостаточно используются во время ожидания.

Временная шкала визуализирует поведение потока : посмотрите, когда потоки работают и ожидают, и когда происходят переходы.

Если вы искали что-то, чтоopen source / free, затем Valgrind имеет экспериментальный инструмент под названием Helgrind, который предположительно находит расы в многопоточных программах.Я не могу комментировать это, я не использовал это.

Я должен отметить, что мне не удалось использовать эти или другие профилировщики для многопоточной отладки и оптимизации, и вместо этого я разработалмои собственные методы.

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

Чтобы определить условия гонки, я считаю, что метод грубой силы является лучшим.Я просто проектирую тест, который может быть запущен в течение длительного периода времени, иногда это часы или дни, в зависимости от ситуации.И я всегда запускаю свой тест по крайней мере на двух разных платформах (больше, если смогу), так как разные ОС используют разные планировщики, и это дает вам лучший охват.

0 голосов
/ 19 апреля 2017

Concurrency Visualizer (бесплатное дополнение к visual studio) - действительно хороший визуализатор параллельных потоков.Включая визуализацию блокировок мьютекса, вытеснения и вызовов.https://msdn.microsoft.com/en-us/library/dd537632.aspx

...