Nano Hash - криптовалюты, майнинг, программирование

Понимание вывода профилировщика CUDA (nvprof)

Я просто смотрю на следующий вывод и пытаюсь понять цифры:

==2906== Profiling result:
Time(%)      Time     Calls       Avg       Min       Max  Name
 23.04%  10.9573s     16436  666.67us  64.996us  1.5927ms  sgemm_sm35_ldg_tn_32x16x64x8x16
 22.28%  10.5968s     14088  752.18us  612.13us  1.6235ms  sgemm_sm_heavy_nt_ldg
 18.09%  8.60573s     14088  610.86us  513.05us  1.2504ms  sgemm_sm35_ldg_nn_128x8x128x16x16
 16.48%  7.84050s     68092  115.15us  1.8240us  503.00us  void axpy_kernel_val<float, int=0>(cublasAxpyParamsVal<float>)
...
  0.25%  117.53ms      4744  24.773us     896ns  11.803ms  [CUDA memcpy HtoD]
  0.23%  107.32ms     37582  2.8550us  1.8880us  8.9556ms  [CUDA memcpy DtoH]

...

==2906== API calls:
Time(%)      Time     Calls       Avg       Min       Max  Name
 83.47%  41.8256s     42326  988.18us  16.923us  13.332ms  cudaMemcpy
  9.27%  4.64747s    326372  14.239us  10.846us  11.601ms  cudaLaunch
  1.49%  745.12ms   1502720     495ns     379ns  1.7092ms  cudaSetupArgument
  1.37%  688.09ms      4702  146.34us     879ns  615.09ms  cudaFree
...

Когда дело доходит до оптимизации доступа к памяти, на какие цифры мне действительно нужно обратить внимание при сравнении различных реализаций? Сначала кажется, что memcpy принимает только 117.53+107.32ms (в обоих направлениях), но затем есть вызов API cudaMemcpy: 41.8256s, что намного больше. Кроме того, столбцы min/avg/max не складываются между верхним и нижним выходными блоками.

Почему такая разница и какое "истинное" число мне важно для оптимизации передачи памяти?

EDIT: второй вопрос: есть ли способ выяснить, кто звонит, например. axpy_kernel_val (и сколько раз)?

21.05.2015

  • Что касается второго вопроса, мы можем сделать вывод, что некоторые функции cublas‹t›axpy() вызывают axpy_kernel_val, поскольку ключевые слова Axpy и cublas заключены в скобки. 29.03.2019

Ответы:


1

Разница в общем времени связана с тем, что работа запускается на GPU асинхронно. Если у вас есть давно работающее ядро ​​или набор ядер без явной синхронизации с хостом, и после них следует вызов cudaMemcpy, вызов cudaMemcpy будет запущен задолго до завершения выполнения ядра(ей). Общее время вызова API — с момента его запуска до момента его завершения, поэтому оно будет совпадать с выполнением ядер. Это очень хорошо видно, если запустить вывод через NVIDIA Visual Profiler (nvprof -o xxx ./myApp, затем импортировать xxx в nvvp).

Разница в том, что минимальное время связано с накладными расходами на запуск. В то время как профилирование API учитывает все накладные расходы на запуск, синхронизация ядра содержит лишь небольшую их часть. Затраты на запуск могут составлять ~10-20 мкс, как вы можете видеть здесь.

В общем, раздел вызовов API позволяет узнать, что делает ЦП, а результаты профилирования говорят о том, что делает ГП. В этом случае я бы сказал, что вы недостаточно используете ЦП, поскольку, возможно, cudaMemcpy запускается слишком рано, и циклы ЦП тратятся впустую. На практике, однако, часто трудно или невозможно получить что-либо полезное из этих запасных циклов.

21.05.2015
  • Спасибо! Итак, пока я просто экспериментирую с выравниванием памяти, закреплением и т. д., достаточно взглянуть на числа в Profiling result, верно? Кроме того, я добавил небольшой второй вопрос, возможно, вы захотите взглянуть. 21.05.2015
  • Я не получил из вашего ответа ответа на вопрос ОП, какие числа мне действительно нужно смотреть при сравнении различных реализаций? 18.06.2021
  • Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..