Для идеально объединенного доступа к массиву 4096
удваивается, каждые 8 байт, nvprof
сообщает о следующих показателях на Nvidia Tesla V100:
global_load_requests: 128
gld_transactions: 1024
gld_transactions_per_request: 8.000000
Я не могу найти специфику c определение того, что транзакция и запрос к глобальной памяти равны точно , поэтому у меня возникают проблемы с пониманием этих метрик. Поэтому мои вопросы:
- Как определяется память запрос определен?
- Как определяется память транзакция определена?
- Показывает ли
gld_transactions_per_request = 8.00000
идеально слитый доступ к двойникам?
Пытаясь объяснить это себе, вот что я придумал:
- Запрос: нагрузка на уровне деформации, то есть одна инструкция уровня деформации, объединенная из 32 потоков. В этом случае загрузка
32 threads * 8 bytes = 256 byte
. - Это правильно? - Транзакция:
32 byte
инструкция загрузки. В этом сценарии одна транзакция, определенная таким образом, может загрузить 32 bytes / 8 bytes = 4
удвоений. -- Это правильно? Если да, то является ли это самой большой инструкцией загрузки, которую реализует Cuda?
Используя эти определения, я получаю те же значения, что и nvprof
: для доступа к 4096 элементам массива требуется 128 инструкций уровня деформации (= запросы) с 32 нитями каждый. Использование 32-байтовых загрузок (= транзакций) приводит к 1024 транзакциям.