После выхода Compute Capability 2.0 (Fermi), я задался вопросом, есть ли какие-либо варианты использования для общей памяти. То есть, когда лучше использовать общую память, чем позволить L1 выполнять свою магию в фоновом режиме?
Является ли разделяемая память просто там, чтобы алгоритмы, предназначенные для CC < 2.0 эффективно работать без изменений?
Чтобы взаимодействовать через общую память, потоки в блоке записываются в общую память и синхронизируются с __syncthreads()
. Почему бы просто не записать в глобальную память (через L1) и синхронизировать с __threadfence_block()
? Последний вариант должен быть проще реализовать, поскольку он не должен относиться к двум различным местоположениям значений, и он должен быть быстрее, потому что нет явного копирования из глобальной в общую память. Поскольку данные получают кеширование в L1, потокам не нужно ждать, пока данные фактически перейдут в глобальную память.
С общей памятью гарантируется, что значение, которое было там поставлено, остается на протяжении всего блока. Это в отличие от значений в L1, которые выселяются, если они не используются достаточно часто. Существуют ли случаи, когда лучше кэшировать такие редко используемые данные в общей памяти, чем позволить L1 управлять ими на основе шаблона использования, который имеет на самом деле алгоритм?