В OpenCL в действии Мэтью Скарпино комментирует, что переключение его префикс-суммы с 32-битного поплавка на 128-битный набор из 4 поплавков приводит к значительному улучшению производительности, почти в 4 раза Быстрее!Почему ожидается float4 выполнить float в префиксной сумме
При запуске приложения CH10/уменьшения, то он будет выполняться как reduction_scalar и reduction_vector ядра. В дополнение к проверке результатов , он измеряет время, затраченное на выполнение каждого ядра. На моей системой получены следующие результаты:
redu_scalar: проверка прошла. Общее время = 489031
уменьшение_vector: проверка прошла. Не Общее время = 136157
Аналогичное требование сделано GPU Gems, ссылаясь на то, что, как представляется, конечно, проект из класса, который больше не доступен.
Мы используем метод, предложенный Дэвидом Lichterman, который обрабатывает восемь элементов на поток вместо двух загрузив два float4 элементов на поток, а не два поплавок элементов (Lichterman 2007).
http://http.developer.nvidia.com/GPUGems3/gpugems3_ch39.html
Одним из объяснений является то, что запросы памяти на резьб идет вверх, но это не имеет смысла для меня, как я ожидаю того же общее количество запросов к памяти выпускается, возможно, в результате чего того же общего представление.
В качестве альтернативы каждый варп выдает запрос, а затем переходит в режим сна. В случае float4
он просыпается в 4 раза больше данных, но в случае float
данные не кэшируются, поэтому последующие потоки также должны будут спать и ждать новых данных. С другой стороны. Я ожидаю, что память будет транслироваться по мере того, как потоки внутри варпа пробуждаются.
Мне интересно, могут ли некоторые эксперты прослушивать и предоставить последовательное объяснение, объясняют, почему float4
выполняет значительно быстрее, чем float
, с точки зрения доступа к памяти или вычисления.
Идея заключается в том, что я считаю, что для насыщения полосы пропускания памяти вам необходимо выдать запросы памяти максимальной ширины для вашего оборудования. Если вы выдаете индивидуальные запросы 1B (char) для каждого рабочего элемента, и если запросы «объединены» с CUDA способом с искажениями из 32 рабочих элементов, вы будете загружать только 32 * 1B за такт на каждый SM. Если вы выдаете отдельные запросы 4B (float), вы загружаете 32 * 4 = 256B за цикл на SM. И если вы используете данные 256B (float4), вы будете загружать 1024B на SM за цикл (при условии, что hw поддерживает его). – Gilles
С более старой архитектурой VLIW от AMD вам нужно было использовать векторы для полного использования аппаратного обеспечения. Их новое оборудование GCN является скалярным, поэтому это больше не нужно. – Dithermaster