Анализ производительности нескольких ядер (CUDA C) - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть программа CUDA с несколькими ядрами, запущенными в серии (в одном потоке - по умолчанию). Я хочу провести анализ производительности для программы в целом, особенно для части графического процессора. Я делаю анализ, используя некоторые метрики, такие как достигаемый_документация, inst_per_warp, gld_efficiency и т. Д., Используя инструмент nvprof.

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

1 Ответ

0 голосов
/ 07 ноября 2018

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

Предположим, у нас было 3 непересекающихся ядра на нашей временной шкале. Допустим, ядро ​​1 работает в течение 10 миллисекунд, ядро ​​2 - в течение 20 миллисекунд, а ядро ​​3 - в течение 30 миллисекунд. В совокупности все 3 ядра занимают 60 миллисекунд в нашей общей шкале времени приложения.

Предположим также, что профилировщик сообщает о метрике gld_efficiency следующим образом:

kernel     duration    gld_efficiency
     1        10ms               88%
     2        20ms               76%
     3        30ms               50%

Вы можете рассчитать средневзвешенное значение следующим образом:

                                     88*10        76*20        50*30
"overall"  global load efficiency =  -----   +    -----    +   ----- = 65%
                                       60           60           60 

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

kernel     gld_transactions    gld_efficiency
     1        1000               88%
     2        2000               76%
     3        3000               50%


                                     88*1000        76*2000        50*3000
"overall"  global load efficiency =  -------   +    -------    +   ------- = 65%
                                       6000           6000           6000 
...