и смотрю примеры сокращения в github с примерами CUDA здесь, а также слежу за этой презентацией здесь
Теперь у меня вопрос об изменениях между версией 0 и версией 1.
Есть два изменения:
- Самый очевидный — удаление операции по модулю, которая является медленной (я принимаю это как должное, потому что так написано, хотя я предполагаю, что это, вероятно, потому, что деление — исторически медленная инструкция)
- Вместо того, чтобы использовать поток, соответствующий текущему шагу (0,1,2,4,8...), он всегда использует смежные потоки (0,1,2,3,4,5,6, 7 для первой итерации цикла, 0,1,2,3 для второй, 0,1 для третьей...)
В контексте второй версии ядра я это вижу. Использование смежных потоков, обращающихся к непрерывной памяти, использует преимущества объединения памяти и устраняет конфликты банков в общей памяти, что приводит к увеличению пропускной способности.
Но дает ли использование смежных потоков само по себе преимущество? Судя по тому, что я изучил до сих пор, кажется, что этого не должно быть. У вас все еще есть расхождение в деформации, что означает, что вы используете меньше ядер, чем доступно, и использование двух соседних ядер вместо ядер, которые находятся далеко, на самом деле не имеет значения, учитывая, что память, к которой они обращаются разрежено, а индексы находятся далеко друг от друга (что исправлено в версии 2). Планировщик деформации также не объединяет активные потоки вместе, поэтому в любом случае вы не сможете запустить полную деформацию. По сути, использование смежных потоков с несмежной памятью мне не кажется таким уж полезным. Я ошибаюсь? Я что-то упускаю из примеров?
Моя другая идея заключается в том, что, возможно, это было более эффективно на старых архитектурах nVidia, у которых было меньше ядер на SM, например, в моем учебнике описана архитектура с 8 cuda ядер на SM, что потребует 4 переключателей контекста для деформации, которые, даже если они быстры на графическом процессоре, не обязательно бесплатны по сравнению с недавними архитектурами с 32 ядрами на SM, которые не требуют переключения контекста внутри деформации. Но мне кажется, что я слишком много обдумываю с этим последним абзацем.
Кроме того, в первоначальном комментарии к версии 2 ядра говорится:
Код: Выделить всё
This version uses sequential addressing -- no divergence or bank conflicts.
Подробнее здесь: https://stackoverflow.com/questions/791 ... n-examples