Предположим, у меня есть полная деформация потоков в блоке CUDA, и каждый из этих потоков предназначен для работы с N элементами типа T, находящимися в общей памяти (таким образом, мы имеем warp_size * N = 32 N элементов).Различные потоки никогда не обращаются к данным друг друга.(Ну, они делают, но на более позднем этапе, который нас не волнует здесь).Этот доступ должен происходить в следующем цикле:
for(int i = 0; i < big_number; i++) {
auto thread_idx = determine_thread_index_into_its_own_array();
T value = calculate_value();
write_to_own_shmem(thread_idx, value);
}
Теперь разные потоки могут иметь разные индексы или одинаковые - я не делаю никаких предположений, так или иначе.Но я хочу минимизировать конфликты в банках совместно используемой памяти.
Если sizeof(T) == 4
, то это просто: просто поместите все данные потока i в адреса совместно используемой памяти i, 32 + i, 64 + i, 96 + i и т. Д. Это помещает все данные i в один и тот же банк, который также отличается от банков других линий.Отлично.
Но теперь - что если sizeof(T) == 8
?Как мне разместить свои данные и получить к ним доступ, чтобы минимизировать банковские конфликты (без каких-либо знаний об индексах)?
Примечание. Предположим, что T - обычные старые данные.Вы даже можете предположить, что это число, если это упрощает ваш ответ.