2014-02-14 2 views
22

Предположим, что я использую VGATHERDPS от AVX2 - это должно загружать 8 однотонных поплавков с использованием 8 индексов DWORD.Как выполняются команды сбора в AVX2?

Что происходит, когда данные, подлежащие загрузке, существуют в разных строках кэша? Является ли инструкция реализована как аппаратный цикл, который извлекает строки кэша один за другим? Или он может одновременно загрузить нагрузку на несколько строк кэша?

Я прочитал пару статей, в которых говорится о первом (и это то, что имеет больше смысла для меня), но я хотел бы узнать об этом немного подробнее.

Ссылка на один документ: http://arxiv.org/pdf/1401.7494.pdf

ответ

18

Я сделал некоторые бенчмаркинг в AVX собрать инструкции и это, кажется, довольно простая реализация грубой силы - даже тогда, когда элементы должны быть загружены являются смежными, кажется, что есть еще один цикл чтения на элемент, поэтому производительность действительно не лучше, чем просто скалярные нагрузки.

+2

Глядя на столы Агнера, это похоже на 20+ часов. Так что да, я бы не назвал эту нативную поддержку. Было бы интересно посмотреть, что делает Skylake. Вероятно, ближе к тому, что делают графические процессоры? (# of cycles = # банковских конфликтов) – Mysticial

+0

В векторном классе Agner Fog у него есть функция под названием 'lookup', которая может использоваться для сбора несвязанных данных из массива или для поиска в таблице, и он утверждает, что эффективность в AVX2 и только в противном случае. На основе этого сбора лучше с Haswell (или скалярные нагрузки лучше). Но я не проводил бенчмаркинга. Я просто иду по его требованию. –

+0

Ну, я думаю, вы используете меньше инструкций, чтобы выполнять ту же работу, когда используете собранную нагрузку, но количество циклов чтения одинаково - возможно, это помогает комбинации команд, хотя, в зависимости от того, что вы на самом деле делать с данными, как только вы его загрузили. –

Смежные вопросы