Cuda производительность без копий

Кто-нибудь имеет опыт анализа производительности приложений CUDA с использованием нулевой копии (ссылка здесь: Закрепленная по умолчанию память против памяти с нулевым копированием) модель памяти?

У меня есть ядро, которое использует функцию нулевого копирования, и с NVVP я вижу следующее:

При работе ядра со средним размером проблемы накладные расходы на воспроизведение инструкций составляют 0,7%, поэтому ничего особенного. И все эти 0,7% являются глобальными затратами на воспроизведение памяти.

Когда я действительно увеличиваю размер проблемы, я получаю накладные расходы при воспроизведении инструкций в размере 95,7%, и все это из-за глобальных накладных расходов при воспроизведении памяти.

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

Главное, в чем я не уверен — какая статистика в NVVP поможет мне увидеть, что происходит с функцией нулевого копирования. Любые идеи о том, какой тип статистики я должен смотреть?

1

Решение

Графические процессоры Fermi и Kepler должны воспроизводить инструкции памяти по нескольким причинам:

  1. Операция с памятью выполнялась для спецификатора размера (типа вектора), который требует нескольких транзакций для выполнения вычисления расхождения адресов и передачи данных в / из кэша L1.
  2. Операция памяти имела расхождение адресов потоков, требующее доступа к нескольким строкам кэша.
  3. Транзакция памяти пропустила кэш L1. Когда значение промаха возвращается в L1, L1 уведомляет планировщик деформации, чтобы воспроизвести инструкцию.
  4. Ресурсы модуля LSU заполнены, и инструкция должна быть воспроизведена, когда ресурс доступен.

Задержка до

  • L2 составляет 200-400 циклов
  • Память устройства (драм) составляет 400-800 циклов
  • нулевое копирование памяти по PCIe — 1000 с циклов

Затраты на воспроизведение возрастают из-за увеличения пропусков и конкуренции за ресурсы LSU из-за увеличенной задержки.

Глобальная эффективность загрузки не увеличивается, поскольку она представляет собой отношение идеального объема данных, который должен быть передан для выполняемых инструкций памяти, к фактическому количеству передаваемых данных. Идеально означает, что исполняемые потоки обращались к последовательным элементам в памяти, начиная с границы строки кэша (32-разрядная операция — 1 строка кэша, 64-разрядная операция — 2 строки кэша, 128-разрядная операция — 4 строки кэша). Доступ к нулевой копии медленнее и менее эффективен, но не увеличивает и не изменяет объем передаваемых данных.

Профилировщик выставляет следующие счетчики:

  • gld_throughput
  • l1_cache_global_hit_rate
  • dram_ {читать, писать} _throughput
  • l2_l1_read_hit_rate

В случае нулевой копии все эти показатели должны быть намного ниже.

Эксперименты с памятью Nsight VSE CUDA Profiler покажут объем данных, к которым осуществляется доступ через PCIe (нулевая копия памяти).

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]