Банки настроены так, что каждый последующий 32 бита находится в следующем банке. Таким образом, если вы объявляете массив с 4-байтовыми числами с плавающей точкой, каждый последующий объект с плавающей точкой в массиве будет находиться в следующем банке (по модулю 16 или 32, в зависимости от вашей архитектуры). Я предполагаю, что у вас есть вычислительная способность 1.x, поэтому у вас есть банк шириной 16.
Если у вас есть массивы 18 и 16, все может быть смешно. Вы можете избежать банковских конфликтов в массиве 16x16, объявив его как
__shared__ float sixteen[16][16+1]
, который позволяет избежать конфликтов банков при доступе к элементам транспонирования с помощью threadIdx.x (как я полагаю, вы делаете, если у вас возникают конфликты). При доступе к элементам, скажем, в первой строке матрицы 16x16 все они будут находиться в 1-м банке. То, что вы хотите сделать, это иметь каждый из них в последовательном банке. Паддинг делает это для вас. Вы обрабатываете массив точно так же, как и раньше, как шестнадцать [строка] [столбец], или аналогично для уплощенной матрицы, как шестнадцать [строка * (16 + 1) + столбец], если хотите.
Для случая 18x18, когда вы получаете доступ в транспонировании, вы двигаетесь с равномерной скоростью. Ответ снова заключается в том, чтобы дополнить 1.
__shared__ float eighteens[18][18+1]
Так что теперь, когда вы получите доступ к транспонированию (скажем, к элементам в первом столбце), он получит доступ как (18 + 1)% 16 = 3, и вы получите доступ к банкам 3, 6, 9, 12, 15, 2, 5, 8 и т. Д., Чтобы не возникало конфликтов.
Конкретный сдвиг выравнивания из-за наличия матрицы размера 18 не проблема, потому что начальная точка массива не имеет значения, это только порядок, в котором вы обращаетесь к нему. Если вы хотите сгладить массивы, которые я предложил выше, и объединить их в 1, это нормально, если вы обращаетесь к ним аналогичным образом.