Чтобы понять, как убедиться, что требования к выравниванию выполнены, я читал следующий отрывок из книги "Неоднородные вычисления с OpenCL p.no: 157" несколько раз. Это показывает, как добавить дополнение к проблеме в свертку изображений (при условии, что размер рабочей группы 16 x 16).
Выравнивание для доступа к памяти
Производительность графических процессоров NVIDIA и AMD выигрывает от выравнивания данных в глобальной памяти. В частности, для NVIDIA выравнивание доступа по 128-байтовым границам и доступ к 128-байтовым сегментам идеально отразится на аппаратном обеспечении памяти. Однако в этом примере рабочие группы 16-го уровня будут иметь доступ только к 64-байтным сегментам, поэтому данные должны быть выровнены на 64-байтные адреса. Это означает, что первый столбец, к которому обращаются каждая рабочая группа, должен начинаться с 64-байтового выровненного адреса. В этом примере выбор того, чтобы пиксельные пиксели не выдавали значения, определяет, что смещение для всех рабочих групп будет кратно размеру рабочей группы (т.е. Для рабочей группы 16 x 16 рабочая группа начнет доступ к данным на столбец N * 16). Чтобы обеспечить соответствие каждой рабочей группы должным образом, единственным требованием является заполнение входных данных дополнительными столбцами, так что его ширина становится кратной X-размерности рабочей группы.
1. Может ли кто-нибудь помочь мне понять, как после заполнения первого столбца, который каждый доступ к рабочей группе начинается с 64-байтного выровненного адреса (требование, упомянутое в приведенном выше отрывке, верно?)?
2. Кроме того, по правилу правильная инструкция: для рабочей группы 16 x 16 рабочая группа начнет доступ к данным в столбце N * 16.
если это правильно, рабочая группа 1,2, как показано на рисунке, должна начать доступ к данным в столбце 1x16 вопреки тому, что показано на рисунке. Я совершенно смущен!!: (
Update: Q-2 теперь мне понятен. Фактически рабочая группа, показанная на рисунке, равна 2,1 (в соглашении opencl, сначала в столбце), поэтому она совершенно правильная: 2x16 = 32, а не 1x16, как я думал.
Но вопрос №. 1 все еще остается без ответа.