вычисление gst_throughput и gld_throughput с помощью nvprof

У меня возникла следующая проблема. Я хочу измерить gst_efficiency и gld_efficiency для моего приложения cuda, используя nvprof. В документации, распространяемой с cuda 5.0, говорится, что я могу их сгенерировать, используя следующие формулы для устройств с вычислительными возможностями 2.0-3.0:

gld_efficiency = 100 * gld_requested_throughput / gld_throughput

gst_efficiency = 100 * gst_requested_throughput / gst_throughput

Для требуемых показателей приводятся следующие формулы:

gld_throughput = ((128 * global_load_hit) + (l2_subp0_read_requests + l2_subp1_read_requests) * 32 - (l1_local_ld_miss * 128)) / gputime

gst_throughput = (l2_subp0_write_requests + l2_subp1_write_requests) * 32 - (l1_local_ld_miss * 128)) / gputime

gld_requested_throughput = (gld_inst_8bit + 2 * gld_inst_16bit + 4 * gld_inst_32bit + 8
* gld_inst_64bit + 16 * gld_inst_128bit) / gputime

gst_requested_throughput = (gst_inst_8bit + 2 * gst_inst_16bit + 4 * gst_inst_32bit + 8
* gst_inst_64bit + 16 * gst_inst_128bit) / gputime

Поскольку для используемых показателей не дается формулы, я предполагаю, что это события, которые можно подсчитать с помощью nvprof. Но некоторые события кажутся недоступными на моем gtx 460 (также пробовал gtx 560 Ti). Я вставил вывод nvprof --query-events.

Есть идеи, что происходит не так или что я неправильно интерпретирую?

РЕДАКТИРОВАТЬ: Я не хочу использовать CUDA Visual Profiler, так как я пытаюсь проанализировать свое приложение по различным параметрам. Поэтому я хочу запустить nvprof, используя несколько конфигураций параметров, записывая несколько событий (каждое за один прогон), а затем выводить данные в таблицах. Я уже автоматизировал это и работаю над другими показателями (например, с выпущенными инструкциями) и хочу сделать это для эффективности загрузки и хранения. Вот почему меня не интересуют решения, связанные с nvvp. Между прочим, для моего приложения nvvp не удается вычислить метрики, необходимые для эффективности магазина, поэтому в данном случае это мне совсем не помогает.


person soriak    schedule 22.03.2013    source источник
comment
Вы можете использовать Visual Profiler, который измеряет эти показатели непосредственно для вас, поэтому вам не нужно собирать все эти события.   -  person Yu Zhou    schedule 26.03.2013
comment
@YuZhou, пожалуйста, посмотрите мой РЕДАКТИРОВАНИЕ, спасибо   -  person soriak    schedule 26.03.2013
comment
Возможно, имена событий в --query-events отображаются не так, как в таблице. Попробуйте использовать следующие формулы: gld_throughput = ((128 * l1_global_load_hit) + (l2_subp0_read_sector_queries + l2_subp1_read_sector_queries) * 32 - (l1_local_ld_miss * 128)) / gputime gst_throughput = (l2_subp0_write_sector_queries + l2_subp1_write_sector_queries) * 32 - (l1_local_ld_miss * 128)) / gputime   -  person Yu Zhou    schedule 27.03.2013


Ответы (1)


Я рад, что у кого-то была такая же проблема :) Я пытался сделать то же самое, но не смог использовать Visual Profiler, потому что хотел профилировать 6000 разных ядер.

Формулы на сайте NVidia плохо документированы - на самом деле переменные могут быть:

а) события

б) другие метрики

в) разные переменные, зависящие от вашего графического процессора

Однако МНОГИЕ метрики либо содержат опечатки, либо в nvprof разбираются немного иначе, чем на сайте. Кроме того, там переменные не помечены, поэтому вы не можете определить, просто посмотрев, относятся ли они к а), б) или в). Я использовал скрипт для их поиска, а затем мне пришлось исправить это вручную. Вот что я нашел:

1) «l1_local / global_ld / st_hit / miss» У них в nvprof вместо «ld» / «st» указано «load» / «store».

2) «l2_ ... безотносительно ... _requests» В nvprof вместо «запросов» содержится «сектор_запросов».

3) "local_load / store_hit / miss" Они имеют "l1_" дополнительно в профилировщике - "l1_local / global_load / store_hit / miss"

4) "tex0_cache_misses" У этого в профилировщике есть "сектор" - "tex0_cache_sector_misses"

5) "tex_cache_sector_queries" Отсутствует "0" - поэтому "tex0_cache_sector_queries" в nvprof.

Наконец, переменные:

1) "#SM" Количество потоковых мультипроцессоров. Получите через cudaDeviceProp.

2) "gputime". Очевидно, время выполнения на GPU.

3) "warp_size" Размер деформации на вашем GPU, снова получить через cudaDeviceProp.

4) "max_warps_per_sm" Количество блоков, исполняемых на sm * #SM * деформациях на блок. Наверное.

5) "elapsed_cycles" Нашел это: https://devtalk.nvidia.com/default/topic/518827/computeprof-34-active-cycles-34-counter-34-active-cycles-34-value-doesn-39-t-make-sense-to-/ Но все еще не совсем уверен, понял ли я.

Надеюсь, это поможет вам и некоторым другим людям, столкнувшимся с той же проблемой :)

person Melchior    schedule 01.05.2013
comment
Спасибо за ответ, здорово, что вы поделились этим. К сожалению, мне пришлось завершить свой проект без этой информации. Но я надеюсь, что ваши решения помогут другим людям. - person soriak; 02.05.2013