CUDA bandwidthTest, чтобы получить достижимый пик
Я хочу знать, насколько хороши мои ядра CUDA с точки зрения использования полосы пропускания памяти. Я запускаю их на Tesla K40c с включенным ECC. Является ли результат, данный bandwidthTest
Полезность хорошее приближение к достижимому пику? Иначе, как можно написать аналогичный тест для определения максимальной пропускной способности?
Я имею в виду пропускную способность памяти устройства.
1 ответ
Исходный код для проверки пропускной способности включен в CUDA SDK, поэтому вы можете просмотреть его напрямую. В примере bandwidthTest выполняется проверка времени передачи между устройством и хостом, хостом и устройством, а также устройством и устройством (передача памяти на карте).
Это реальное выполнение передачи памяти, но оно использует преимущества нескольких вещей:
- Средние и большие передачи памяти. Если вы делаете тонны крошечных переводов, вы заплатите высокий штраф в накладных расходах, и это снизит ваши ставки перевода.
- Приколол память. BandwidthTest использует закрепленную память, так что передача может быть максимально быстрой. Вы можете или не можете иметь эту опцию.
- Устойчивое чтение / запись памяти. Насколько я помню, bandwidthTest выполняет несколько передач, которые могут быть поставлены в очередь. Любые задержки при запуске или аномалии будут сглажены, и у него будет то преимущество, что он объединит множество передач в очередь. Возможно, вам придется сделать перевод-работа-работа-перевод, чтобы у вас могли возникнуть дополнительные задержки. Улучшения в передаче памяти из CUDA 5 могут помочь в смягчении этого.
Реальная работа с ядром во время передачи памяти, вероятно, приведет к снижению производительности. Тем не менее, вы можете сослаться на код проверки пропускной способности и использовать его в качестве руководства для улучшения ваших передач. Рассмотрите закрепленную память, асинхронные передачи или более новые методы совместной памяти, которые не требуют явной передачи данных. Также имейте в виду, что bandwidthTest учитывает только объемные передачи вокруг памяти и на самом деле не измеряет такие вещи, как общая память.
Конечная производительность будет сильно зависеть от ядра, а также от количества и объема передаваемой памяти.