Ответ 1
Память - это память. Но разные вещи могут получить доступ к этой памяти. Графический процессор может получить доступ к памяти, процессор может получить доступ к памяти, а может быть, к другим аппаратным битам, что угодно.
У конкретной вещи есть "согласованный" доступ к памяти, если изменения, сделанные другими в этой памяти, видны читателю. Теперь вы можете подумать, что это глупость. В конце концов, если память была изменена, как кто-то может не увидеть ее?
Проще говоря, кеши.
Оказывается, изменение памяти дорого. Поэтому мы делаем все возможное, чтобы избежать изменения памяти, если мы не будем абсолютно обязаны. Когда вы пишете один байт от CPU до указателя в памяти, CPU еще не записывает этот байт. Или, по крайней мере, не в память. Он записывает его в локальную копию этой памяти, называемую "кешем".
Причиной этого является то, что, вообще говоря, приложения не записывают (или не читают) одиночные байты. Они с большей вероятностью будут писать (и читать) много байтов в небольших кусках. Поэтому, если вы собираетесь выполнять дорогостоящую операцию, такую как загрузка или хранение в памяти, вы должны загрузить или сохранить большой кусок памяти. Таким образом, вы сохраняете все изменения, которые собираетесь внести в кусок памяти в кеше, а затем сделайте одну запись этого кэшированного фрагмента в фактическую память в какой-то момент в будущем.
Но если у вас есть два отдельных устройства, которые используют одну и ту же память, вам нужно каким-то образом убедиться, что записи одного устройства видны другим устройствам. Большинство графических процессоров не могут читать кеш процессора. И на большинстве языков ЦП нет поддержки на уровне языка, чтобы сказать "эй, что я написал в память? Я действительно хочу, чтобы ты теперь записывал ее в память". Поэтому вам обычно нужно что-то, чтобы обеспечить видимость изменений.
В Vulkan память, помеченная как "HOST_COHERENT", означает, что если вы пишете в эту память (через отображаемый указатель, поскольку это единственный способ, с помощью которого Vulkan позволяет вам напрямую записывать в память), вам не нужно использовать специальные чтобы убедиться, что графический процессор может видеть эти изменения. Графический обзор любых изменений гарантирован. Если этот флаг недоступен в памяти, вы должны использовать API Vulkan для обеспечения согласованности определенных областей данных, к которым вы хотите получить доступ.
С когерентной памятью происходит одна из двух вещей с точки зрения аппаратного обеспечения. Либо доступ к ЦП в память не кэшируется ни в одном из кэшей ЦП, либо у графического процессора есть прямой доступ к кэшам ЦП (возможно, из-за того, что они находятся на той же матрице, что и CPU (ы)). Обычно вы можете сказать, что последнее происходит, потому что встроенные GPU-реализации Vulkan не потрудились предлагать некогерентные варианты памяти.