У меня есть приложение, в котором мне нужно транслировать одно (не постоянное, просто старое) значение в глобальной памяти для всех потоков. Потокам нужно только прочитать значение, а не писать ему. Я не могу явно указать приложению использовать постоянный кеш (например, cudaMemcpyToSymbol), потому что я использую библиотеку памяти, которая не дает мне явного элемента управления низкого уровня.Совместный доступ к широковещательному доступу к глобальной ячейке памяти на GPU
Мне интересно, как эта трансляция проходит под капотом и как она может отличаться от обычной схемы доступа, в которой каждый поток обращается к уникальной глобальной ячейке памяти (для простоты предполагают, что эта «обычная» схема доступа объединяется). Меня особенно интересуют любые неявные сериализации, которые могут иметь место в широковещательном случае, и как это может зависеть от разных архитектур.
Например, для Fermi, предположительно, первый поток для доступа к значению вытащит его в кэш L2, а затем к его кешу L1 SM, после чего каждый поток, находящийся на SM, попытается захватить его из L1 кэш. Есть ли какой-либо штраф за сериализацию, когда все потоки пытаются получить доступ к одному и тому же значению кеша L1?
Для Kepler предположительно первый поток для доступа к значению вытащит его в кэш L2 (тогда он может или не может потянуть его в кеш L1 в зависимости от того, включено ли кэширование L1). Есть ли какой-либо штраф за сериализацию, когда все потоки пытаются получить одно и то же значение в L2?
Кроме того, раздел кемпинга беспокоит?
Я нашел еще один couple из questions, который адресовал аналогичную тему, но не на уровне детализации, достаточном для удовлетворения моего любопытства.
Заранее благодарен!
Привет, Роберт, Большое спасибо за ваш ответ. Я бы использовал память __constant__, если бы мог, но, к сожалению, в этом случае я не могу контролировать это. –
Понял. Я упомянул об этом на благо других читателей. –
Это поднимает еще один момент любопытства в моем сознании, если вы потакаете мне: предположим, что у каждого SM есть то же значение, что и в кеше L1. Предположим, что поток на одном SM теперь записывается в это значение. Согласно [этой слайде 39] (http://on-demand.gputechconf.com/gtc/2013/presentations/S3466-Programming-Guidelines-GPU-Architecture.pdf), которая приведет к аннулированию соответствующей строки кэша в L1, и записать в соответствующую строку кэша в L2. Мой вопрос: делает ли это также недействительным значение, хранящееся в кеше L1 другими SM? –