«Объединение» может также относиться к объединению шаблонов доступа к памяти . В этом случае объединение используется для того, чтобы убедиться, что потоки работают одновременно, и попытаться получить доступ к памяти, которая находится поблизости. Это обычно потому что:
- Память обычно извлекается большими блоками из оперативной памяти.
- Некоторые процессоры будут пытаться предсказать будущие обращения к памяти и кешировать заранее, в то же время обрабатывая более старые части памяти.
- Память кэшируется в иерархии последовательно увеличивающихся, но более медленных кэшей.
Поэтому важно создавать программы, которые могут использовать предсказуемые шаблоны памяти. Это даже более важно для многопоточной программы, чтобы запросы памяти не перепрыгивали; в противном случае блок обработки будет ожидать выполнения запросов памяти.
Диаграммы, вдохновленные введением в параллельное программирование: урок 2 Аппаратное обеспечение графического процессора и шаблоны параллельной связи :
Ниже: четыре потока, с единообразным доступом к памяти. Черный пунктирный прямоугольник представляет один запрос памяти из 4 слов.
Доступ к памяти близок и может быть получен за один раз / блок (или наименьшее количество запросов).
Однако, если мы увеличим « шаг » доступа между потоками, это потребует гораздо большего доступа к памяти. Ниже: еще четыре нити, с шагом два.
Здесь вы можете видеть, что эти 4 потока требуют 2 запроса блока памяти. Чем меньше шаг, тем лучше. Чем шире шаг, тем больше запросов потенциально требуется.
Конечно, хуже, чем большой шаг памяти, является шаблон произвольного доступа к памяти. Это будет почти невозможно передать, кэшировать или прогнозировать.
Источники TikZ: