Происходит ли сериализация одновременных глобальных обращений к памяти по одному адресу при наличии уровней кэша L1 и L2?

StackOverflow https://stackoverflow.com//questions/20014054

  •  21-12-2019
  •  | 
  •  

Вопрос

Основываясь на том, что я знаю, когда потоки основы обращаются к одному и тому же адресу в глобальной памяти, запросы сериализуются, поэтому лучше использовать постоянную память.Происходит ли сериализация одновременных глобальных обращений к памяти, когда GPU оснащен уровнями кэша L1 и L2 (в архитектуре Fermi и Kepler)?Другими словами, когда потоки основы обращаются к одному и тому же глобальному адресу памяти, выигрывает ли 31 поток основы от существования кэша, потому что 1 поток уже запросил этот адрес?Что происходит, когда доступ осуществляется на чтение, а также когда доступ осуществляется на запись?

Это было полезно?

Решение

Одновременный глобальный доступ к одному и тому же адресу потоками в одном и том же warp в Fermi и Kepler не сериализуется.У чтения warp есть механизм широковещательной передачи, который удовлетворяет все такие чтения из одного чтения cacheline без влияния на производительность.Производительность такая же, как если бы это было полностью объединенное чтение.Это верно независимо от специфики кэша, например, это верно, даже если кэширование L1 отключено.

Производительность одновременной записи не указана (AFAIK), но поведенчески, одновременные записи всегда сериализуются, а порядок не определен.

Редактировать ответы на дополнительные вопросы ниже:

  1. Даже если все потоки в warp записывают одно и то же значение в один и тот же адрес, сериализуется ли оно?Разве не существует механизма широковещательной записи, который распознает такую ситуацию?

Не существует механизма широковещательной записи, который просматривал бы все одновременные записи, чтобы увидеть, все ли они одинаковы, а затем предпринимал какие-либо действия на основе этого.Правильный ответ заключается в том, что записи происходят в неуказанном порядке, а характеристики производительности не определены.Очевидно, что если все записываемые значения одинаковы, вы можете быть уверены, что значение, которое окажется в местоположении, будет именно этим значением.Но если вы спрашиваете, сворачивается ли операция записи до одного цикла или для ее завершения требуется несколько циклов, это фактическое поведение не определено (недокументировано) и фактически мочь различаются от одной архитектуры к другой (например, cc1.x может сериализовать таким образом, что выполняются все операции записи, тогда как cc2.x может "сериализовать" таким образом, что одна запись "выигрывает", а все остальные отбрасываются, не потребляя фактических циклов.) Опять же, производительность недокументирована / не указана, но программа-наблюдаемая поведение определено.

2 С этим механизмом широковещательной передачи, который вы объяснили, единственная разница между широковещательным доступом к постоянной памяти и широковещательным доступом к глобальной памяти заключается в том, что первый может направлять доступ вплоть до глобальной памяти, но последний имеет выделенное оборудование и работает быстрее, верно?

__constant__ memory использует постоянный кэш, который представляет собой выделенную аппаратную часть, доступную для каждого SM, и кэширует определенный раздел глобальной памяти в доступно только для чтения Мода.Этот кэш HW физически и логически отделен от кэша L1 (если он существует и включен) и кэша L2.Для Fermi и не только оба механизма поддерживают широковещательную передачу при чтении, а для постоянного кэша это предпочтительный шаблон доступа, поскольку постоянный кэш может обслуживать только один доступ на чтение за цикл (т. е.не поддерживает чтение всей строки кэша с помощью warp.) Любой механизм может "попасть" в кэш (если присутствует) или "пропустить" и вызвать глобальное чтение.При первом чтении данного местоположения (или линии кэширования) кэш niether будет иметь запрошенные данные, и поэтому он "пропустит" и запустит глобальное чтение памяти для обслуживания доступа.После этого, в любом случае, последующие операции чтения будут обслуживаться из кэша, при условии, что соответствующие данные не будут удалены за это время.Для ранних устройств cc1.x кэш постоянной памяти был довольно ценным, поскольку у этих ранних устройств не было кэша L1.Для Fermi и за его пределами основной причиной использования постоянного кэша было бы, если бы идентифицируемые данные (т.е.доступны только для чтения) и шаблоны доступа (один и тот же адрес для каждой деформации), тогда использование постоянного кэша предотвратит прохождение этих операций чтения через L1 и, возможно, удаление других данных.Фактически вы несколько увеличиваете объем кэшируемого пространства по сравнению с тем, что может поддерживать только L1.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top