Россия, г. Саранск |
Оптимизация параллельной программы
10.8.4.3. Окно Timeline
Окно Timeline содержит три основных элемента, также как и окно Profile: рабочая область, панель инструментов и легенда. Панель инструментов в данном случае предназначена лишь для изменения масштаба временной оси.
10.8.4.3.1 Рабочая область
В рабочей области окна Timeline содержится информация о поведении потоков. В верхней части рабочей области имеется временная шкала. Ниже располагаются полосы, каждая из которых соответствует одному потоку приложения.
На рис. 10.22 показано, что в нашем приложении было запущено три потока. Также можно увидеть, что один из них существовал с начала времени выполнения приложения, а два других были созданы позже. Время жизни потока равно длине полосы. Раскраска полосы не всегда одинакова - она указывает на состояния потока в различные моменты времени (см. легенду). Наведите курсор мыши на бледно-зеленую часть самой верхней полосы, соответствующей основному потоку. В появившейся подсказке будет сказано, что на этом промежутке времени поток находился в режиме ожидания.
Рассмотрим подробнее момент возникновения потоков. Для этого в рабочей области необходимо выделить область, охватывающую розовую стрелку. Наведите курсор мыши немного левее стрелки, зажмите левую клавишу и, передвиньте курсор правее стрелки, после чего отпустите кнопку мыши. Повторите увеличение еще несколько раз, пока вид в рабочей области не станет таким, как показано на рис. 10.23.
Здесь уже можно видеть, что второй поток был создан несколько позже первого. Наведите курсор мыши на одну из розовых стрелок и убедитесь, что она соответствует вызову функции создания потока. Длина этой стрелки, спроектированная на ось времени, показывает время задержки между вызовом функции создания потока и фактическим его запуском.
Кроме того, поверх зеленых полос, указывающих состояние потоков, яркими цветами накладывается информация о критическом пути. На изучаемом нами промежутке времени имеются участки последовательного и параллельного исполнения потоков. Нетрудно понять, что оранжевый участок соответствует интервалу времени, когда в приложении существовал только один поток, а участок зеленого цвета соответствует одновременной работе двух потоков.
Вернемся к изучению трассы приложения в целом. Нажмите на панели инструментов окна Timeline кнопку с изображением воронки и красного креста. Рабочая область снова должна принять вид как на рис. 10.21.
Глядя на этот рисунок, можно сразу понять, в чем причины того, что основную часть времени наше приложение работает в последовательном режиме. Мы неравномерно распределили вычислительную нагрузку между потоками. Второй из дочерних потоков работает гораздо дольше первого, в результате чего увеличивается суммарное время работы приложения. Таким образом, если мы хотим повысить производительность нашего приложения, то первое, что мы должны сделать, это распределить нагрузку между потоками равномерно. Тогда время работы приложения сократится за счет того, что часть нагрузки второго дочернего потока будет отдана первому.
Последнее, что осталось изучить в рабочей области окна Timeline - это как из него получить доступ к исходному коду. Наведите курсор мыши на любую из полос, соответствующих дочерним потокам, и нажмите правую кнопку мыши. В появившемся контекстном меню выберите пункт Thread Creation/Entry Source View. Откроется окно с исходным кодом, отвечающим за создание потока.
Вернитесь к окну Timeline и наведите курсор на бледно-зеленую часть полосы, соответствующей основному потоку приложения, нажмите правую кнопку мыши и выберите пункт Transition Source View. Откроется окно с исходным кодом, в котором указано место ожидания основного потока (рис. 10.24).
В нашем случае это вызов функции WaitForMultipleObjects, которая необходима здесь для ожидания завершения дочерних потоков.
Вернемся к окну Timeline и рассмотрим легенду.
10.8.4.3.2 Выбор показателей поведения потоков для визуализации
Общая структура и функции легенды такие же, как и в окне Profile, поэтому мы не будем останавливаться на кнопках-флажках Thread State и Critical Path Data. Вы можете поэкспериментировать с ними и проследить, как меняется вид в рабочей области окна Timeline.
Рассмотрим назначение новых кнопок-флажков. Первый из них имеет название Transitions и отвечает за отображение в рабочей области стрелок, соответствующих посылке сигналов между потоками. Снимите флажок Fork/Join - останутся три стрелки желтого цвета, показывающие посылаемые в приложении сигналы. В нашем случае это сигналы, связанные с созданием и завершением потоков.
Теперь снимите флажок Transitions и установите флажок Fork/Join. Должны появиться стрелки, указывающие на вызовы функций класса Fork/Join (создание и ожидание завершения потоков). Можно заметить, что они совпадают с желтыми стрелками, которые мы видели до этого. Единственное отличие - появление розовой стрелки, соединяющей конец полосы первого дочернего потока с полосой основного потока.
Последний флажок называется User Event. Мы не станем рассматривать его, подробная информация о нем может быть найдена в [10.7].
Таким образом, мы выяснили, что наше приложение содержит поток, большую часть времени работающий в последовательном режиме. Причины такой ситуации и способы увеличения производительности нашего примера мы рассмотрим в лабораторной работе 1.
10.8.5. Контрольные вопросы
- Наличие каких цветов в критическом пути свидетельствует о проблемах с производительностью приложения?
- На какие цвета, по вашему мнению, нужно обратить внимание прежде всего?
- Если вам известно несколько причин низкой производительности вашего приложения, в какой последовательности лучше их устранять?
- Зачем используется группировка?
- В чем разница между группировкой по объектам и по типам объектов?
- В окне Profile установите первичную группировку по потокам, а вторичную по уровню параллелизма. Установите соответствие между столбцами в окне Profile и полосами в окне Timeline.
- Как было установлено, основная причина медленной работы учебного приложения - неравномерное распределение нагрузки между потоками. Предложите ваш способ решения данной проблемы.