Что такое когерентная память на GPU?

Я не раз натыкался на термин "некогерентная" и "когерентная" память в

технические работы связанные с графическим программированием.Я искал простое и ясное объяснение, но нашел в основном "хардкорные" статьи этой тип.Я был бы рад получить ответ в стиле layman о том, какая когерентная память на самом деле находится на архитектурах GPU и как она сравнивается с другими (вероятно, не когерентными) типами памяти.

2 ответов


память памяти. Но разные вещи могут получить доступ к этой памяти. GPU может получить доступ к памяти, CPU может получить доступ к памяти, возможно, другие аппаратные биты, что угодно.

определенная вещь имеет "когерентный" доступ к памяти, если изменения, внесенные другими в эту память,видимого к читателю. Вы можете подумать, что это глупость. В конце концов, если память была изменена, как мог кто-то возможно не видит его?

проще говоря, тайники.

оказывается, что изменение памяти дорого. Поэтому мы делаем все возможное, чтобы избежать изменение памяти без необходимости. Когда вы записываете один байт из ЦП в указатель в памяти, ЦП еще не записывает этот байт. Или, по крайней мере, не на память. Он записывает его в локальную копию этой памяти, называемую "кэш"."

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

но если у вас есть два отдельных устройства, которые используют одну и ту же память, вам нужно каким-то образом убедиться, что пишет один устройство делает видимым для других устройств. Большинство графических процессоров не могут прочитать кэш процессора. И большинство языков CPU не имеют языковой поддержки, чтобы сказать: "Эй, что я написал в память? Я действительно хочу, чтобы ты запомнил это сейчас."Поэтому вам обычно нужно что-то, чтобы обеспечить видимость изменений.

в Vulkan память, которая помечена как "HOST_COHERENT", означает, что если вы пишете в эту память (через сопоставленный указатель, так как это единственный способ, которым Vulkan позволяет вам напрямую писать в память), вы не необходимо использовать специальные функции, чтобы убедиться, что GPU может видеть эти изменения. Видимость GPU любых изменений гарантируется. Если этот флаг недоступен в памяти, вы должны использовать API Vulkan для обеспечения согласованности определенных областей данных, к которым вы хотите получить доступ.

с когерентной памятью происходит одна из двух вещей с точки зрения аппаратного обеспечения. Либо доступ процессора к памяти не кэшируется ни в одном из кэшей процессора, либо GPU имеет прямой доступ к Кэш процессора (возможно, из-за того, что он находится на той же матрице, что и процессор(Ы)). Обычно вы можете сказать, что последнее происходит, потому что реализации GPU на-die Vulkan не утруждают себя предложением некогерентных опций памяти.


Если память когерентна, то все потоки, обращающиеся к этой памяти, должны всегда согласовывать состояние памяти, например: если поток 0 читает местоположение памяти A, а поток 1 читает одно и то же местоположение одновременно, оба потока всегда должны читать одно и то же значение.

но если память не когерентна, то потоки A и B могут считывать разные значения. Поток 0 может подумать, что это место содержит 1, а нить думает, что это место содержит 2. Другой поток бы некогерентного вид памяти.

согласованности трудно достичь с большим количеством ядер. Часто каждое ядро должно знать о доступе к памяти из всех других ядер. Поэтому, если у вас есть 4 ядра в четырехъядерном процессоре, когерентность не так сложно достичь, поскольку каждое ядро должно быть проинформировано об адресах доступа к памяти 3 других ядер, но в GPU с 16 ядрами каждое ядро должно быть осведомлено о доступе к памяти 15 другими ядрами. Ядра обмениваются данными о содержимое их кэша с использованием так называемых"протоколов когерентности кэша".

вот почему графические процессоры часто поддерживают только ограниченные формы согласованности. Если некоторые ячейки памяти доступны только для чтения или только одному потоку, то когерентность не требуется. Если кэши небольшие и когерентность не всегда требуется, а только по определенным инструкциям программы, то можно добиться правильного поведения программы с помощью промывки кэша до или после конкретных обращений к памяти.

Если ваше оборудование предлагает как когерентные, так и некогерентные типы памяти, то вы можете ожидать, что некогерентная память будет быстрее, но если вы попытаетесь запустить параллельные алгоритмы с использованием этой памяти, они потерпят неудачу очень странными способами.