У меня есть код для умножения матриц, работающий на моем Geforce 940m (архитектура Maxwell) с возможностью вычислений CUDA 5.0. Я использовал NVIDIA Visual Profiler для измерения количества глобальных транзакций загрузки и глобальных транзакций загрузки на запрос. Я вручную рассчитал количество операций чтения из глобальной памяти и разделил его на количество транзакций из Profiler. Результат всегда равен 4. Каждый из моих деформаций обращается к выровненному блоку из 32 чисел с плавающей запятой: float x = A[n*32+tx]...
, где tx - первая координата в индексе потока. Я ожидал, что все 32 числа с плавающей точкой будут переданы в одной 128-байтовой транзакции. Почему отношение инструкций к транзакциям всегда 4 в моем случае? Я также измерил глобальные нагрузки на запрос, которые всегда равны 8 - что, по-видимому, согласуется с моими вычислениями - 4 операции с плавающей запятой на одну транзакцию, поэтому 8 транзакций на 32 операции за один запрос деформации.
Я думаю, что это как-то связано с кешем, но не могу найти, как именно он работает. У кого-то уже был подобный вопрос, но ответ не объясняет, почему это 4 для Максвелла в случае 1, описанном в ответе, который является моим случаем: * Модифицировано * Nvidia Maxwell, увеличено общее количество команд в глобальной памяти