Б.И.Илюшкин

   Основные средства профилирования программ.

    Простое профилирование программы .

Профилирование - оценка основных характеристик производительности программы (построение профиля). Простейший профиль программы - число обращений и время выполнения каждой подпрограммы (функции). Наиболее простым средством профилирования служит системная команда time для оценки времени выполнения.

        Пример

            time a.out

        Результат

            4.0  real    #   время выполнения программы
      0.1  user    #   время использования процессора
      0.1  sys     #   время выполнения системных функций (ввод/вывод и др.)
В разных shell оболочках имеются разные варианты  time , для  SPP лучше использовать bs

      /bin/time  a.out        для  SPP
        px  time  a.out        для  Parsytec

Для оценки времени выполнения можно использовать также программный таймер. При помощи
обращения к функции  dtime(), etime()  и др. можно оценить время выполнения программы или
какой-либо ее части.

        Пример

            program main
            . . . . . . . . . . . . . . . . . . . . . . . .

            real tt1(2),tt2(2) ! массивы для dtime() . . . . . . . . . . . . . . . . . . . . . . . .
            t1=dtime(tt1) ! 1-ый выполняемый оператор . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

            t2=dtime(tt2)          !  последний выполняемый оператор
            print *,'Real time =',t2-t1
            stop
            end
Первый вызов  dtime() измеряет время выполнения данного процесса. Следующие вызовы   dtime() измеряют время выполнения от предыдущего вызова. tt1(1) - содержит User's time , tt1(2) - System time.
Функция  dtime() возвращает сумму User's и System time и может быть вызвана из параллельного участка программы, т.е. при использовании опции  -О3 .
dtime () - библиотечная функция Фортрана, которая находится в библиотеке libU77.a. Для использования ее в программе на С необходимо учитывать соглашения об именах CONVEX Fortran [3]. Имена библиотечных функций CONVEX Fortran имеют дополнительный символ (_) в конце имени (SPP серия) или два дополнительных символа (_) - в конце и вначале имени (С серия) для их отличия от пользовательскиж и библиотечных функций других языков. Компилятор CONVEX Fortran (SPP серия) при компиляции программы добавляет символ (_) к символическим именам функций из библиотеки libU77 , а компилятор CONVEX C не добавляет. Для С серии компилятор CONVEX Fortran добавляет два символа (_) - в начале и в конце, а CONVEX C один (_) вначале. Поэтому для использования  dtime () в программе на  С необходимо добавлять символ (_) к символическому имени функции в исходном коде.

        Пример
            . . . . . . . . . . . . . . . . . . . . . . . .

            extern float dtime_();
            . . . . . . . . . . . . . . . . . . . . . . . .

            void main()
          {
            . . . . . . . . . . . . . . . . . . . . . . . .
            float tt1(2),tt2(2) ; // массивы для dtime() . . . . . . . . . . . . . . . . . . . . . . . .
            t1=dtime_(tt1) ; // 1-ый выполняемый оператор . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
            t2=dtime_(tt2) ;         //  последний выполняемый оператор
            printf("Real time =%f\n",t2-t1);
           }

Строка вызова компилятора должна включать библиотеку

        cc prog.c -lU77 ! для SPP и С серий

B Фортран программе для Parsytec необходимо использовать имя  dtime_().

        px f77 -o prog.px prog.f /usr/lib/libxlfpad.a ! для Parsytec

Для построения простейшего профиля программы можно использовать стандартный профилировщик prof ( кроме SPP серии ), осуществляющий профилирование программы по всем вызываемым функциям. Для этого необходимо скомпоновать выполняемый файл с опцией  -p. При использовании данной опции генерируется код, вычисляющий число вызовов и время вызова каждой функции. При нормальном выполнении программы создается профильный файл  mon.out , используемый затем профилировщиком prof для генерирования отчета.

        Пример

            fc -o prog -p prog.f  ! компоновка выполняемого модуля
      prog                    ! выполнение prog
      prof prog > prog.prof ! вывод отчета профилирования

В отчете выводятся следующие характеристики по каждой функции :

Характеристики выводятся в виде таблицы в порядке убывания времени выполнения. Фрагмент таблицы приводится ниже.

  %time   cumsecs  #call     ms/call name
  56.9     2.38        1    2380.00  _recon_
  25.6     3.45    25704       0.04  _coef_
   7.4     3.76               310ms  mcount
   1.7     3.83      418       0.17  _wrt_EMfloat$n
   1.4     3.89                60ms  _for$d_ecvt_a$n
   1.0     3.93       10       4.00  ___ap$open
   1.0     3.97        4      10.00  _for$do_fio
   0.7     4.00       15       2.00  ___ap$stat
   0.5     4.02        1      20.00  _MAIN__
   0.5     4.04       28       0.71  ___ap$fstat

Результаты профилирования зависят от системных условий и поэтому необходимо несколько раз
повторять профилирование кода программы для сравнения. Более надежные и подробные характеристики
производительности программы можно получить при использовании CXpa.
 

    Основные возможности CXpa .

CXpa (Convex performance analyzer) версии 3.5 для SPP - интерактивный анализатор производительности программ, компилируемых с яэыков Fortran, C, C++ (Hewlett Packard и CONVEX) .
        CXpa поддерживает :
   - профилирование программ (функций), циклов, включая циклы, оптимизированные компилятором и
     параллельные циклы, базовых  блоков ;
   - профилирование объектных и библиотечных модулей, созданных  Hewlett Packard PA-RISC
     компиляторами ( f77,c89, C++ ) ;
   - получение характеристик производительности как по отдельным нитям процесса, так и в целом по процессу ;
   - профилирование приложений с использованием передачи сообщений  ( message - passing applications ) .

        Основные измеряемые характеристики .
    Процессорное время ( CPU time ) .
    Время решения ( Wall clock time ) .
    Количество вызовов п/программ, функций, базовых блоков ( call counts ) .
    Граф динамических вызовов    (dynamic    call graph) .

        Дополнительные характеристики ( events ) .

Набор дополнительных характеристик зависит от архитектуры и включает характеристики использования кэша, машинного кода и буфера трансляции адресов .
            Характеристики кэша .
                Внепроцессорные ( off-processor events ) .

Включают следующие характеристики :

               % CPU = (latemcy time / CPU time ).

Низкое значение % CPU означает, что большинство данных процессором взято из кэша. Если значение %CPU велико, значительная часть процессорного времени затрачивается на поиск данных в памяти .

                Процессорные ( on - processor events ) .

Включают следующие характеристики :

% Hits = ( total data cache accesses - data cache misses ) / ( total  data cache accesses ) .

Низкое значение % Hits указывает на наложение строк кэша ( cache thrashing ) .

            Характеристики эффективности машинного кода .
В число характеристик входят следующие :
      - количество выполненных команд ( number of instructions ) ;
       - средняя продолжительность команды за машинный такт ( average clock cycles per instruction ) ;
V        - среднее быстродействие команды ( average MIPS rate ) .
MIPS - million of instruction per second .

Метрика Т измеряет эффективность цепочки команд ( instruction scheduling ). Для SPP 1200 и SPP 1600 серий, максимальное количество команд, которые могут быть выполнены за один машинный такт, равно 2. Таким образом теоретическая пиковая величина Т равна 0.5 .
Если величина Т велика для часто вызываемой подпрограммы с простым программным кодом, включение ( inlining ) кода тела подпрограммы в вызывающую программу может улучшить эффективность кода. В некоторых случаях эффективность кода может быть улучшена путем компилирования программы на более высоком уровне оптимизации .

Среднее быстродействие команды вычисляется по следующей формуле :

V = ( number of instructions completed ) / ( wall clock time (in sec.)) = N / wall_clock .

Теоретически пиковая производительность ( peak MIPS rate ) для Hewlett Packard PA - RISC 7100/7200 с частотой 100 MHz равна 200 MIPS .

        Характеристики буфера трансляции .
Буфер трансляции TLB ( translation lookside buffer ) предназначен для ускорения преобразования виртуальных адресов команд и данных в физические. В буфере хранятся наиболее часто используемые адреса. В число характеристик входят :

    Основные режимы работы CXpa .

  CXpa имеет 3 режима :

      оконный  ( X Window ) ;
      строчный  ( line ) ;
      пакетный  ( batch ) .

 X Window режим реализует многооконный интерфейс для визуализации характеристик производительности программы, в том числе 2-х и 3-х -мерных гистограммы характеристик, графа динамических вызовов подпрограмм и т.д., а также текстовые отчеты.
Двухмерная гистограмма отображает характеристики процесса в целом, трехмерная - нитей процесса для параллельных участков кода и подрограмм для последовательных участков. Графики могут быть сохранены в PostScript  или  xwd форматах для печати или в  ASCII формате для экспорта в другие системы.
X Window режим позволяет анализировать характеристики различных вариантов программ, в том числе выполнявшихся на компьютерах разной архитектуры  HP SPP.
Line режим позволяет получать характеристики производительности в текстовом виде .
Batch режим позволяет использовать  script для запуска файлов сбора характеристик и генерирования отчетов.

    Основные этапы профилирования .

    Построение загрузочного модуля программы.

Компилятор при указании дополнительных опций добавляет в компонуемый модуль команды для сбора профилируемых данных (instrumentatin). Полученные характеристики программы записываются в специальный файл с расширением pdf  во время выполнения программы.

Допускаются следующие опции :

При компиляции одного файла исходного кода может быть использована только одна из опций. Разные исходные файлы могут быть компилированы с разными опциями.

        Пример.   Раздельная компиляция и линкование.

        cc  -c  main.c                !
       cc  -cxpa  -O1  -c  sub1.c    !     компиляция
       cc  -cxpa  -c   sub2.c        !

       cc  -cxpa  main.o  sub1.o  sub2.o    !     линкование

        Пример.  Компиляция и линкование за один шаг.

        cc -cxpa -O1 main.c

 Установка параметров профилирования ( profile selection settings ).

Для установки параметров необходимо вызвать профилировщик CXpa с именем исполняемого файла.

        Пример

          cxpa a.out ?    # вызов в X Window режиме
      cxpa -nw a.out  # вызов в line режиме

Параметры профилирования задаются при помощи следующих команд.

    Select -  выбор областей исходного кода для профилирования .

            Возможны следующие типы областей :

                 routine         -  программы и функции ;
                 loop             -  циклы ;
                 pregion         -  параллельные циклы ;
                 block                -  базовые блоки .

                Дополнительные опции команды :

                 all                          -  для всех подпрограмм ( функций ) программы ;
                 in ? список >       -  для заданного через пробел списка подпрограмм ;
                 at ? список >   -  для заданных номеров строк ;

             Пример

             ( CXpa )    select  routine  all     #  все программы
      ( CXpa ) select pregion in sub2      # параллельные циклы в sub2

 Collect - специфицирование характеристик (метрик) ,вычисляемых  при профилировании .

Возможны следующие типы метрик :

    cpu                     - процессорное время ;
    wall_clock     - время решения ;
    counts             - количество вызовов подпрограмм, итераций циклов ;
    call_graph    - граф динамических вызовов подпрограмм (функций) ;
    events            - характеристики эффективности кэша, машинного кода, буфера трансляции .

Для задания конкретных типов  events  используется команда :

          set  event

        Пример

        ( CXpa ) select routine all
    ( CXpa ) collect cpu wall_clock events
    ( CXpa ) set events data_cache

        Пример

         ( CXpa ) select loop all
    ( CXpa ) collect wall_clock cpu

Save executable  - сохранение установок параметров профилирования в исполняемом модуле программы
                               ( или в его копии ) .

Предварительно необходимо снять защиту по записи с исполняемого модуля.

        chmod a+w a.out       # снятие защиты с модуля  a.out

        Пример

        ( CXpa )  select routine all
    ( CXpa )  collect cpu wall_clock
    ( CXpa )  save executable         # сохранение установок в текущем исполняемом модуле
    ( CXpa )  quit                    #  выход из  CXpa

        Пример

         ( CXpa ) save executable new.a.out  #  сохранение установок в копии исполняемого модуля
                                                                                          #  с именем   new.a.out

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

 Запуск исполняемого модуля программы на счет .

После запуска исполняемого модуля на счет, кроме получения результатов счета осуществляется профилирование программы. Полученные данные производительности заносятся в специальный файл с расширением  pdf .
 

 Печать выходного отчета .

    Analyze  - создание и печать выходного отчета

Генерация отчета полученных характеристик осуществляется на основе информации, накопленной в  pdf файле. Для создания отчета необходимо вызвать профилировщик  CXpa с опцией -pdf и именем pdf файла.

        Пример

        CXpa   -nw -pdf a.out.pdf        # вызов в line режиме

      ( CXpa )  analyze

Командная строка для  analyze  может включать следующие параметры :

    ? metric list > - список задаваемых характеристик

Допустимые варианты значений :

    ?region - type >  -  спецификация области программы

Допустимые варианты значений :

    ? routine list > - список подпрограмм (функций) через пробел, для которых выводится отчет .

    ? redirection >  - вывод отчета в указанный файл .

Если параметры в команде analyze отсутствуют, отчет генерируется по всем профилированным областям и для всех специфицированных характеристик .

        Пример

        ( CXpa ) analyze wall_clock

Печать времени решения по всем профилированным областям.

        ( CXpa ) analyze events loop sub2

Печать полученных event характеристик для всех циклов программы sub2 .

        ( CXpa ) analyze cpu wall_clock call_graph

Печать процессорного времени, времени решения и графа динамических вызовов по всем профилированным областям .

        ( CXpa ) analyze events cpu > a.rep

Вывод event характеристик и процессорного времени в файл  a.rep .
 

Общий подход к профилированию .

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

Стратегия профилирования .

Выбор практической стратегии профилирования обусловлен оптимизацией затрат времени на получение характеристик производительности и удобной формой их представления для последующего анализа. С учетом данных соображений осуществлять профилирование программы и генерацию отчетов целесообразно на начальном этапе в пакетном ( batch ) режиме.
Рассмотрим структуру script файла profb , предназначенного для крупнозернистого профилирования программы. Данный script файл позволяет :     # batch file : cxpb.0
    # selection source code regions , specification of collectables metrics
    # saving settings to the current executable file (instrumentation)
       select routine all
       collect cpu wall_clock call_graph
       save executable
       quit

Если необходимо осуществлять профилирование по нитям процесса, используется файл cxpb.1

Для генерации отчетов используются файлы cxp1.0 , cxp1.1 , cxp1.2 . Применение batch файлов позволяет генерировать отчеты по основным характеристикам производительности с разной степенью детализации. Включает процессорное время главной нити процесса, а также времена доступа к диску, памяти, операций ввода/вывода, системных вызовов, ожидания ( process idle time ) .
  Данный показатель ( коэффициент параллелизации ) характеризует степень распараллеливания программы. Низкое значение коэффициента ( ?? 1 ) указывает на плохую возможность для распараллеливания ( узкое место для повышения производительности ), вызванное операциями ввода/вывода, вызова функций, системными вызовами, обращениями к данным вне процессорного кэша и т.д.
Для последовательных участков программы ( однонитевый процесс ) коэффициент характеризует степень замедления программы ( compute bound ), вызванное данным участком ( подпрограммой, циклом и т.д. ) .
Для параллельных участков программы ( мультинитевый процесс ) коэффициент характеризует увеличение скорости, достигнутое за счет распараллеливания. Если отношение приближается к n , где n - число процессоров данного подкомплекса, то степень параллелизации хорошая.
  Содержит количество вызовов , CPU , Wall clock time каждой подпрограммы. В отчет выводится таблица, состоящая из секций для каждой вызываемой подпрограммы или функции ( в соответствии со структурой программы ). Каждая из секций включает  имя головной программы секции - отмечается знаком > в крайней левой колонке , имя вызывающей головную программу программы - перед именем головной программы ,
       ( start  - имя головной программы высшего уровня. Вызывающая программа
                 для нее отсутствует),
имена программ, вызываемых из головной программы - после имени головной программы .
Колонки таблицы содержат следующую информацию :  prog.lst - краткий отчет ( CPU , Wall clock time и количество нитей процесса ) .
Данный отчет позволяет увидеть как меняются основные характеристики в зависимости от выбранного уровня автоматической оптимизации .
 prog.rp - "узкие" места ( Wall clock , CPU / Wall clock ) .
Данный отчет позволяет выделить "узкие" места в программе, снижающие общее быстродействие .
 prog.rpf - подробный отчет ( CPU , Wall clock , CPU / Wall clock , Call graph ) .
Подробный отчет включает все основные характеристики программы .
    prog.l      - суммарный краткий отчет .
    prog.r      - суммарный отчет "узких" мест .
    prog.rf     - суммарный подробный отчет .
Суммарные отчеты включают характеристики профилирования по отдельным запускам script файла. Для большей достоверности результатов необходимо осуществить несколько запусков в разное время .
 prog.opt - отчет выполненных преобразований оптимизации ( уровни O1 и выше ) .
 prog.res - выходные результаты счета программы .
 prog.cxp - протокол профилирования ( для контроля ) .
 prog.cxpa - сообщения об ошибках СXpa .

Командная строка запуска profb в фоновом режиме имеет следующий вид :
profb prog [ "llib" ] ?    где  prog - имя программы на Фортране ,
                                                               llib - имя библиотеки если используется.
Для запуска программы на С необходимо запустить profbc
profbc prog [ "llib" ] ?     где  prog - имя программы на С ,
                                                                     llib  - имя библиотеки если используется

Для профилирования программы на заданном уровне оптимизации можно использовать файл prof1b .

#!/bin/csh
#                                         (#!/usr/contrib/bin/tcsh )
# Name: prof1b
# Using shell script for profiling program on signed optimization and
# profiling levels and generating report in background mode
#
# Command line for running:      prof1.b "prog" "O" "L" "-llib"
#                 where:
#  "prog" -- name of Fortran source code
#  "O" -- optimisation level : [ no, O0, O1, O2, O3 ]
#  "L" -- profiling level : [ 0, 1 ] - invokes file "cxpb.L"
#              0 - routine         1 - threads
#  "lib" -- name of library (if is used)
#
# Output data :
#
#  "prog.rpf" -- full output performance report
#  "prog.rp" -- output performance report ( Wall_Clock , CPU/Wall_Clock)
#  "prog.LST" -- short output performance report ( CPU ,Wall_Clock )
#  "prog.opt" -- optimizing transformations report
#  "prog.res" -- output data (results)
#  "prog.cxpa"-- CXpa messages ? protocol
#  "prog.cxp"-- profiling's protocol
#  "prog.rf" -- summary (realisations) full output report
#  "prog.L" -- summary (realisations) short output report
#  "prog.R" -- summary (realisations) output report
#
# CXpa batch files are used :     cxpb.0 (cxpb.1) , cxp1.0 , cxp1.1 , cxp1.2
#
echo '\n Optimisation level: '-$2' options: '-$2 $4 > $1.cxp
echo '\n Optimisation level: '-$2' options: '-$2 $4 > $1.opt
echo '\n Optimisation level: '-$2' options: '-$2 $4 > $1.LST
echo '\n Optimisation level: '-$2' options: '-$2 $4 > $1.rp
#
fc -o $1 -$2 -cxpa $1.f $4 >>? $1.opt
chmod a+w $1
#
echo '\n Convex performance analyzer CXpa \n' >> $1.cxp
#echo ' command line:     cxpa -nw -x' cxpb.$3 $1 >> $1.cxp
echo '\n Profiling level ' $3 >> $1.cxp
#cat cxpb.$3 >> $1.cxp
rm $1.*.pdf >>? $1.tmp
cxpa -nw -x cxpb.$3 $1 >? $1.cxpa
$1 >? $1.res
echo 'command line:     cxpa -nw -pdf '$1.$2.pdf -x cxp1.0 >> $1.cxp
cat cxp1.0 >> $1.cxp
cp $1.*.pdf $1.$2.pdf >>? $1.tmp
cxpa -nw -pdf $1.$2.pdf -x cxp1.0 >>? $1.cxpa
cat a.lst >> $1.cxp
cat a.lst | grep 'CPU Time :' >> $1.LST
cat a.lst | grep 'Wall Clock Time :'>> $1.LST
cat a.lst | grep Archit >> $1.LST
#
echo '\n Optimisation level: ' -$2 > $1.rpt
echo '\n Profiling level: ' $3 >> $1.rpt
echo '\n Convex performance analyzer CXpa \n' >> $1.rpt
echo ' command line: cxpa -nw -pdf '$1.$2.pdf' -x cxp1.1 \n' >> $1.rpt
cat cxp1.1 >> $1.rpt
cxpa -nw -pdf $1.$2.pdf -x cxp1.1 >>? $1.cxpa
cat a.lst >> $1.rpt
cxpa -nw -pdf $1.$2.pdf -x cxp1.2 >>? $1.cxpa
cat a.lst >> $1.rp
#
cat $1.rpt >> $1.rr
cat $1.LST >> $1.L
cat $1.rp >> $1.R
#

Командная строка запуска  prof1b в фоновом режиме имеет следующий вид :

        prof1b prog "O" "L" ["llib"] ?

  где   prog - имя программы на Фортране ,
          O    -  уровень оптимизации ( no,O0,O1,O2,O3 ) ,
          L    -  уровень профилирования (0 , 1)  0 - программа , 1 - нити
          llib -  имя библиотеки если используется.

 Для запуска программы на  С  запускается  prof1bc .
Запускаемые программы не должны иметь интерактивного ввода. В случае зависания программы в фоновом режиме ( tty output ) необходимо повторить запуск в интерактивном режиме.
Описанные script файлы и вспомогательные файлы находятся в каталоге   sd2a/boris/prof/cxpa.
 

Примеры профилирования .

    1.  Простая тестовая программа приближенного вычисления интеграла на интервале [0,1] от функции f(x)= 4/(1+x*x) по правилу средних прямоугольников. Число разбиений интервала задается. Исходный код p.f. Командная строка запуска профилирования :
                profb p ?

CONVEX Fortran (fc) Version 9.5 Tue Nov 18 18:22:37 1997 Page 0001
Options: -no -LST -tm spp1600 -f90 -fi -o p.o

    1           program main
    2 c     
    3           real tt1(2),tt2(2)
    4           integer*4 i,n
    5           double precision sum,h,f,x
    6           f(x)=4.d0/(1.d0+x*x)
    7           n=12000000
    8           t1=etime(tt1)                 !first call
    9           h=1.d0/n                      ! step
   10           sum=0.0d0
   11 c
   12           do 10 i=1,n
   13           sum=sum+h*f((i-.50)*h)
   14    10   continue
   15 c
   16           t2=etime(tt2)                 ! second call
   17           print *,'Real time =',t2-t1,'Sum =',sum
   18           print *,'Sum - pi =',sum - 3.14159265358979323846d0
   19           stop
   20           end

        Краткий отчет профилирования ( файл  p.l ) .

Optimisation level: no options: -no
CPU Time : 5.403 secs
Wall Clock Time : 16.873 secs
Architecture : CONVEX SPP-1600 (1 thread)

Optimisation level: O0 options: -O0
CPU Time : 4.294 secs
Wall Clock Time : 13.521 secs
Architecture : CONVEX SPP-1600 (1 thread)

Optimisation level: O1 options: -O1
CPU Time : 3.702 secs
Wall Clock Time : 11.756 secs
Architecture : CONVEX SPP-1600 (1 thread)

Optimisation level: O2 options: -O2
CPU Time : 2.314 secs
Wall Clock Time : 7.184 secs
Architecture : CONVEX SPP-1600 (1 thread)

Optimisation level: O3 options: -O3
CPU Time : 2.462 secs
Wall Clock Time : 0.873 secs
Architecture : CONVEX SPP-1600 (8 threads)

Optimisation level: no options: -no
CPU Time : 5.403 secs
Wall Clock Time : 14.392 secs
Architecture : CONVEX SPP-1600 (1 thread)

Optimisation level: O0 options: -O0
CPU Time : 4.295 secs
Wall Clock Time : 10.726 secs
Architecture : CONVEX SPP-1600 (1 thread)

Optimisation level: O1 options: -O1
CPU Time : 3.702 secs
Wall Clock Time : 9.610 secs
Architecture : CONVEX SPP-1600 (1 thread)

Optimisation level: O2 options: -O2
CPU Time : 2.314 secs
Wall Clock Time : 6.692 secs
Architecture : CONVEX SPP-1600 (1 thread)

Optimisation level: O3 options: -O3
CPU Time : 2.467 secs
Wall Clock Time : 0.877 secs
Architecture : CONVEX SPP-1600 (8 threads)

Данные отчета показывают, что наименьшее время решения при уровне оптимизации O3. При этом коэффициент параллелизации CPU/Wall_clock = 2.59, что указывает на распараллеливание программы.

Отчет профилирования "узких мест" ( файл p.r ) .

Optimisation level: O3 options: -O3
Profiling level: routine  


                           CXpa Version 3.5 Profile
Executable      : /sd2a/boris/prof/p
Profile Data : /sd2a/boris/prof/p.O3.pdf Process State : exited
CPU Time : 2.333 secs
Wall Clock Time : 0.903 secs
Architecture : CONVEX SPP-1600 (8 threads)  

Routine Performance Analysis  


                               Time to Solution
         (less children)                (plus children)
 Wall Clock     %    CPU/Wall   Wall Clock     %    CPU/Wall   PS Routine Name
------------  -----  --------- ------------  -----  ---------  -- ------------
       0.900   99.6%      2.59        0.900   99.6%      2.59  e  start
    2. Простая тестовая программа приближенного вычисления определителя
     квадратной матрицы со случайными элементами и обратной матрицы.
     Используются программы из библиотеки  veclib. Размерность матрицы
     задается.
     Исходный код  d3.f. Командная строка запуска профилирования :

               
profb d3 -lveclib &

 CONVEX Fortran (fc)    Version 9.5      Tue Nov 18 19:57:23 1997              Page 0001
Options: -no -LST -tm spp1600 -f90 -fi -o d3.o

    1           program main
    2 c evaluation of determinant of a general dense n-by-n matrix A with 3 c random elements and computation of inverse
       c matrix A**(-1)
    4           integer NN,N,IER,JOB,ISE
    5           PARAMETER (NN=400)
    6           INTEGER*4 IPVT(NN)
    7           REAL*8 A(NN,NN),DET(2),DETA,WORK(NN)
    8           real tt1(2),tt2(2),RAN,a1,a2
    9           call dtime(tt1)
   10           a1=-1.
   11           a2=1.
   12           N=385
   13           JOB=11
   14           ISE=1876
   15           DO 20 I=1,N
   16           DO 20 J=1,N
   17     20    A(I,J)=a1+RAN(ISE)*(a2-a1)
   18 c computation of the triangular factorisation of a general dense n-by-n matrix A
   19           CALL DGEFA(A,NN,N,IPVT,IER)          ! CONVEX VECLIB
   20           IF(IER .EQ.0) THEN
   21 c evaluation of det(A)=DET(1)*10.0**INT(DET(2)) and computation A**(-1)
   22            CALL DGEDI(A,NN,N,IPVT,DET,WORK,JOB)  ! CONVEX VECLIB
   23           ELSE
   24            PRINT *,'A is computationally singular'
   25           END IF
   26            IF (DET(1).EQ.0.0D0) THEN
   27              DETA=0.0D0
   28            ELSE IF (DET(2).LE.306) THEN
   29              DETA=DET(1)*10.0D0**INT(DET(2))
   30             ELSE
   31              PRINT *,'the determinant of A is too large to evaluate'
   32            END IF
   33           call dtime(tt2)
   34           PRINT *,'det(A) =',DETA,' DET(1)=',DET(1),' DET(2)=',DET(2)
   35           PRINT *,' User time = ',tt2(1)-tt1(1)
   36           PRINT *,' Sys time = ',tt2(2)-tt1(2)
   37           END

        Краткий отчет профилирования ( файл  d3.l ) .

Optimisation level: no options:     -no -lveclib
CPU Time : 256.498 secs
Wall Clock Time : 213.764 secs
Architecture : CONVEX SPP-1600 (8 threads)

Optimisation level: O0 options:     -O0 -lveclib
CPU Time : 84.019 secs
Wall Clock Time : 69.633 secs
Architecture : CONVEX SPP-1600 (8 threads)

Optimisation level: O1 options:     -O1 -lveclib
CPU Time : 161.104 secs
Wall Clock Time : 130.998 secs
Architecture : CONVEX SPP-1600 (8 threads)

Optimisation level: O2 options:     -O2 -lveclib
CPU Time : 80.393 secs
Wall Clock Time : 70.544 secs
Architecture : CONVEX SPP-1600 (8 threads)

Optimisation level: O3 options:     -O3 -lveclib
CPU Time : 194.481 secs
Wall Clock Time : 164.786 secs
Architecture : CONVEX SPP-1600 (8 threads)

Optimisation level: no options:     -no -lveclib
CPU Time : 163.092 secs
Wall Clock Time : 140.288 secs
Architecture : CONVEX SPP-1600 (8 threads)

Optimisation level: O0 options:     -O0 -lveclib
CPU Time : 132.511 secs
Wall Clock Time : 105.183 secs
Architecture : CONVEX SPP-1600 (8 threads)

Optimisation level: O1 options:     -O1 -lveclib
CPU Time : 251.750 secs
Wall Clock Time : 216.434 secs
Architecture : CONVEX SPP-1600 (8 threads)

Optimisation level: O2 options:     -O2 -lveclib
CPU Time : 231.541 secs
Wall Clock Time : 212.228 secs
Architecture : CONVEX SPP-1600 (8 threads)

Optimisation level: O3 options:     -O3 -lveclib
CPU Time : 322.565 secs
Wall Clock Time : 271.796 secs
Architecture : CONVEX SPP-1600 (8 threads)

Данные отчета показывают, что наименьшее время решения при уровнях оптимизации O0 ,О2 . При этом максимальное значение коэффициента параллелизации CPU/Wall_clock = 1.2 достигается на уровне О3 что указывает на слабую параллелизацию программы. Профилировщик выдает ошибочную информацию относительно использования 8 нитей процесса на уровнях no,...,O2 ( в действительности 1 нить).

Фрагмент отчета профилирования "узких мест" ( файл d3.r ) .

Optimisation level: O0 options:     -O0 -lveclib  



                           CXpa Version 3.5 Profile
Executable      : /sd2a/boris/prof/d3

Profile Data : /sd2a/boris/prof/d3.O0.pdf
Process State : exited
CPU Time : 310.901 secs
Wall Clock Time : 323.390 secs
Architecture : CONVEX SPP-1600 (8 threads)  

                            Routine Performance Analysis  


                               Time to Solution
         (less children)                (plus children)
 Wall Clock     %    CPU/Wall   Wall Clock     %    CPU/Wall   PS Routine Name
------------  -----  --------- ------------  -----  ---------  -- ------------
     323.385  100.0%      0.96      323.385  100.0%      0.96  e  start
Optimisation level: O2 options:     -O2 -lveclib
Profiling level: routine  

                           CXpa Version 3.5 Profile
Executable      : /sd2a/boris/prof/d3

Profile Data : /sd2a/boris/prof/d3.O2.pdf
Process State : exited
CPU Time : 190.072 secs
Wall Clock Time : 189.129 secs
Architecture : CONVEX SPP-1600 (8 threads)  

                        Routine Performance Analysis  


                               Time to Solution
         (less children)                (plus children)
 Wall Clock     %    CPU/Wall   Wall Clock     %    CPU/Wall   PS Routine Name
------------  -----  --------- ------------  -----  ---------  -- ------------
     189.123  100.0%      1.01      189.123  100.0%      1.01  e  start
        3. Программа исследования тепловой конвекции.

Исходный код t.f. Командная строка запуска профилирования :

    profb t & или profb t -lveclib &

Краткий отчет профилирования ( файл t.l ) .

Optimisation level: no options: -no -lveclib
CPU Time : 0.433 secs
Wall Clock Time : 1.048 secs
Architecture : CONVEX SPP-1600 (1 thread)

Optimisation level: O0 options: -O0 -lveclib
CPU Time : 0.354 secs
Wall Clock Time : 0.484 secs
Architecture : CONVEX SPP-1600 (1 thread)

Optimisation level: O1 options: -O1 -lveclib CPU Time : 0.338 secs
Wall Clock Time : 0.467 secs
Architecture : CONVEX SPP-1600 (1 thread)

Optimisation level: O2 options: -O2 -lveclib CPU Time : 0.337 secs
Wall Clock Time : 0.842 secs
Architecture : CONVEX SPP-1600 (1 thread)

Optimisation level: O3 options: -O3 -lveclib CPU Time : 0.345 secs
Wall Clock Time : 0.755 secs
Architecture : CONVEX SPP-1600 (8 threads)

Optimisation level: -O3 options: -O3
CPU Time : 0.345 secs
Wall Clock Time : 0.713 secs
Architecture : CONVEX SPP-1600 (8 threads)

Optimisation level: -O3 options: -O3 -lveclib CPU Time : 0.345 secs
Wall Clock Time : 0.722 secs
Architecture : CONVEX SPP-1600 (8 threads)

Optimisation level: no options: -no -lveclib CPU Time : 0.435 secs
Wall Clock Time : 1.225 secs
Architecture : CONVEX SPP-1600 (1 thread)

Optimisation level: O0 options: -O0 -lveclib CPU Time : 0.355 secs
Wall Clock Time : 1.688 secs
Architecture : CONVEX SPP-1600 (1 thread)

Optimisation level: O1 options: -O1 -lveclib CPU Time : 0.340 secs
Wall Clock Time : 1.248 secs
Architecture : CONVEX SPP-1600 (1 thread)

Optimisation level: O2 options: -O2 -lveclib CPU Time : 0.339 secs
Wall Clock Time : 1.178 secs
Architecture : CONVEX SPP-1600 (1 thread)

Optimisation level: O3 options: -O3 -lveclib CPU Time : 0.346 secs
Wall Clock Time : 1.236 secs
Architecture : CONVEX SPP-1600 (8 threads)

Данные отчета показывают, что трудно выделить оптимальный уровень оптимизации. Отчет "узких мест" показывает что максимальное время решения в % от общего расходуется подпрограммой sfdat и при этом значение коэффициента параллелизации CPU/Wall_clock очень мало, что указывает на "узкое место" в программе.

Фрагмент отчета профилирования "узких мест" ( файл t.r ) .

Optimisation level: -O3 options: -O3  



                           CXpa Version 3.5 Profile
Executable      : /sd2a/boris/prof/t

Profile Data : /sd2a/boris/prof/t.O3.pdf
Process State : exited
CPU Time : 0.345 secs
Wall Clock Time : 0.713 secs
Architecture : CONVEX SPP-1600 (8 threads)  

                        Routine Performance Analysis  


                               Time to Solution
         (less children)                (plus children)
 Wall Clock     %    CPU/Wall   Wall Clock     %    CPU/Wall   PS Routine Name
------------  -----  --------- ------------  -----  ---------  -- ------------
       0.309   43.4%       0.08        0.309    43.4%      0.08     sfdat
       0.219   30.7%       0.70        0.219    30.7%      0.70     coef
       0.177   24.8%       0.94        0.707    99.2%      0.49     recon
       2.341m   0.3%      0.10        0.709    99.5%      0.49  e  start
       2.015m   0.3%      0.06        2.015m   0.3%      0.06     nuint
       0.045m   0.0%      0.96        0.045m   0.0%      0.96     popri
Optimisation level: O1 options:     -O1 -lveclib
Profiling level: routine  

                           CXpa Version 3.5 Profile
Executable      : /sd2a/boris/prof/t

Profile Data : /sd2a/boris/prof/t.O1.pdf
Process State : exited
CPU Time : 0.340 secs
Wall Clock Time : 1.248 secs
Architecture : CONVEX SPP-1600 (1 thread)  

Routine Performance Analysis  


                               Time to Solution
         (less children)                (plus children)
 Wall Clock     %    CPU/Wall   Wall Clock     %    CPU/Wall   PS Routine Name
------------  -----  --------- ------------  -----  ---------  -- ------------
       0.487   39.0%       0.05        0.487    39.0%      0.05     sfdat
       0.433   34.7%       0.38        1.241    99.4%      0.27     recon
       0.322   25.8%       0.47        0.322    25.8%      0.47     coef
       5.132m   0.4%      0.03        1.246    99.9%      0.27  e  start
       0.102m   0.0%      1.01        0.102m   0.0%      1.01     nuint
       0.054m   0.0%      0.98        0.054m   0.0%      0.98     popri
  343          subroutine sfdat(z,nx,ny,ijk,hx,hy)
  344          dimension B(3,209),x(19),y(11),z(19,11)
  345          do 11 i=1,nx
  346   11     x(i)=hx*(i-1.)
  347          do 12 j=1,ny
  348   12     y(j)=hy*(j-1.)
  349          do 1 j=1,ny
  350          do 2 i=1,nx
  351          ij=i+(j-1)*nx
  352          B(1,ij)=x(i)
  353          B(2,ij)=y(j)
  354          B(3,ij)=z(i,j)
  355   2     continue
  356   1     continue
  357          if(ijk)4,4,5
  358   4     open(4,file='BT.dat')
  359          close (4,status='delete')
  360          open (4,file='bt.dat')
  361          write (4,42) B
  362          close (4)
  363          goto 6
  364   5     open(5,file='BP.dat')
  365          close (5,status='delete')
  366          open (5,file='BP.dat')
  367          write (5,42) B
  368          close (5)
  369   6     return
  370   42   format(3e13.5)
  371          end

        Анализ исходного кода программы  sfdat  показывает наличие функций вывода в файл на диск. Для оценки их влияния на время выполнения можно заменить вывод на диск выводом во внутренние массивы в памяти, используя операторы encode или write [2] и осуществить повторное профилирование. Преобразованный код программы имеет следующий вид :

  343          subroutine sfdat(z,nx,ny,ijk,hx,hy)
  344          dimension B(3,209),x(19),y(11),z(19,11)
  345          character*39 ab(209)
  346          do 11 i=1,nx
  347   11     x(i)=hx*(i-1.)
  348          do 12 j=1,ny
  349   12     y(j)=hy*(j-1.)
  350          do 1 j=1,ny
  351          do 2 i=1,nx
  352          ij=i+(j-1)*nx
  353          B(1,ij)=x(i)
  354          B(2,ij)=y(j)
  355          B(3,ij)=z(i,j)
  356   2     continue
  357   1     continue
  358          do 33 j=1,209
  359          encode (39,42,ab(j)) B(1,j),B(2,j),B(3,j)
  360   33   continue
  361   c      if(ijk)4,4,5
  362   c 4   open(4,file='tt.dat')
  363   c      close (4,status='delete')
  364   c      open (4,file='t1.dat')
  365   c       write (4,43) ab
  366   c       close (4)
  367          goto 6
  368   c 5    open(5,file='tt.dat')
  369   c      close (5,status='delete')
  370
  371   c      open (5,file='BP.dat')
  372   c       write (5,43) ab
  373   c       close (5)
  374   6      return
  375   42     format(3e13.5)
  376   43     format(A39)
  377          end

        Дополнительно описывается символьный массив  character*39 ab(209)  для внутреннего вывода преобразованных в символьную форму элементов массива В. Тип массива (char*39) определяется строкой формата (3e13.5). Новые данные профилирования показывают улучшение характеристик. Снизился процент времени выполнения sfdat и возрос коэффициент параллелизации.

Фрагменты новых отчетов профилирования ( файлы t2.l , t2.r ) .

Optimisation level: -O2 options: -O2 -lveclib
CPU Time : 0.343 secs
Wall Clock Time : 0.366 secs
Architecture : CONVEX SPP-1600 (1 thread)

Optimisation level: no options: -no -lveclib
CPU Time : 0.437 secs
Wall Clock Time : 0.466 secs
Architecture : CONVEX SPP-1600 (1 thread)

Optimisation level: O0 options: -O0 -lveclib
CPU Time : 0.355 secs
Wall Clock Time : 0.376 secs
Architecture : CONVEX SPP-1600 (1 thread)

Optimisation level: O1 options: -O1 -lveclib
CPU Time : 0.342 secs
Wall Clock Time : 0.451 secs
Architecture : CONVEX SPP-1600 (1 thread)

Optimisation level: O2 options: -O2 -lveclib
CPU Time : 0.342 secs
Wall Clock Time : 0.427 secs
Architecture : CONVEX SPP-1600 (1 thread)

Optimisation level: O3 options: -O3 -lveclib
CPU Time : 0.352 secs
Wall Clock Time : 0.573 secs
Architecture : CONVEX SPP-1600 (8 threads)

Optimisation level: -O2 options: -O2 -lveclib  



                           CXpa Version 3.5 Profile
Executable      : /sd2a/boris/prof/t2

Profile Data : /sd2a/boris/prof/t2.O2.pdf
Process State : exited
CPU Time : 0.343 secs
Wall Clock Time : 0.366 secs
Architecture : CONVEX SPP-1600 (1 thread)  

                                    Routine Performance Analysis  



                               Time to Solution
         (less children)                (plus children)
 Wall Clock     %    CPU/Wall   Wall Clock     %    CPU/Wall   PS Routine Name
------------  -----  --------- ------------  -----  ---------  -- ------------
       0.174   47.6%       0.94        0.362   99.0%      0.95     recon
       0.152   41.6%       0.99        0.152   41.6%      0.99     coef
       0.035    9.6%        0.78        0.035     9.6%      0.78     sfdat
       1.825m   0.5%      0.07        0.364   99.5%      0.94  e  start
       0.746m   0.2%      0.13        0.746m   0.2%     0.13     nuint
       0.031m   0.0%      1.00        0.031m   0.0%     1.00     popri

        Таким образом видно что для повышения производительности программы необходимо улучшить структуру sfdat ,а также recon и coef. Для этого необходимо максимально сократить операции ввода/вывода на диск путем использования операторов динамического выделения памяти allocate и внутренних массивов для буферизации [2]. Подробный отчет позволяет получить дополнительную информацию.

Фрагмент подробного отчета профилирования ( файл t2.rf ) .

Optimisation level: -O2
Profiling level: 0
Convex performance analyzer CXpa
command line: cxpa -nw -pdf t2.O2.pdf -x cxp1.1  



                           CXpa Version 3.5 Profile
Executable      : /sd2a/boris/prof/t2

Profile Data : /sd2a/boris/prof/t2.O2.pdf
Process State : exited
CPU Time : 0.343 secs
Wall Clock Time : 0.366 secs
Architecture : CONVEX SPP-1600 (1 thread)  

                        Routine Performance Analysis  


                                  Call Counts
   Times Exec    PS                       Routine Name
---------------- -- ----------------------------------------------------------
           25704    coef
               5    popri
               4    nuint
               2    sfdat
               1    recon
               1 e  start
                                  Computation
         (less children)      (plus children)
  CPU Time      %               CPU Time      %                PS Routine Name
------------  -----            ------------  -----             -- ------------
       0.164   47.9%                   0.342  100.0%               recon
       0.151   44.0%                   0.151    44.0%               coef
       0.027     8.0%                   0.027      8.0%               sfdat
       0.126m   0.0%                  0.343  100.0%            e  start
       0.099m   0.0%                  0.099m   0.0%               nuint
       0.031m   0.0%                  0.031m   0.0%               popri

                               Time to Solution
         (less children)                (plus children)
 Wall Clock     %    CPU/Wall   Wall Clock     %    CPU/Wall   PS Routine Name
------------  -----  --------- ------------  -----  ---------  -- ------------
       0.174   47.6%       0.94        0.362   99.0%      0.95     recon
       0.152   41.6%       0.99        0.152   41.6%      0.99     coef
       0.035     9.6%       0.78        0.035     9.6%      0.78     sfdat
       1.825m   0.5%      0.07        0.364   99.5%      0.94  e  start
       0.746m   0.2%      0.13        0.746m   0.2%     0.13     nuint
       0.031m   0.0%      1.00        0.031m   0.0%     1.00     popri

                              Dynamic Call Graph

  Wall (with   CPU (with     calls     calls  PS    routine
  children)       children)         in         out           names
------------------------------------------------------------------------------
>     0.364       0.343            1            1 e     start
       0.362       0.342                          1        recon
------------------------------------------------------------------------------
       0.362       0.342            1                      start
>     0.362       0.342            1     25715       recon
       0.152       0.151                   25704       coef
       0.035       0.027                           2       sfdat
       0.746m    0.099m                        4       nuint
       0.031m    0.031m                        5       popri
------------------------------------------------------------------------------
       0.152       0.151     25704                     recon
>     0.152       0.151     25704            0       coef
------------------------------------------------------------------------------
       0.035       0.027             2                     recon
>     0.035       0.027             2            0       sfdat
------------------------------------------------------------------------------
       0.746m     0.099m         4                     recon
>     0.746m     0.099m         4            0       nuint
------------------------------------------------------------------------------
       0.031m      0.031m         5                    recon
>     0.031m      0.031m         5           0       popri

Для визуализации полученных характеристик удобно использовать X Window режим. Строка запуска имеет следующий вид :

    cxpa *.pdf &

В этом случае список полученных pdf файлов характеристик появляется в Analysis Control window и можно выбрать нужный для визуализации характеристик. Для получения справочной информации необходимо использовать CXpa Help window в X window режиме или команду ( CXpa ) help в line режиме.

Литература .

  1. CONVEX CXpa Reference , Second Edition , June 1996 .
  2. CONVEX Fortran Language Reference , Eleventh Edition , October 1994 .
  3. CONVEX Fortran User's Guide , Eleventh Edition , October 1994 .