2015-03-20 4 views
2

Я выполняю оптимизацию на C-петлях, и я просто читаю разматывание и аккумуляторы. Если данные не зависят друг от друга в цикле, использование разворачивания и аккумуляторов действительно использует параллелизм, и код заканчивается быстрее.Ограничения разворота цикла C?

Так что моя наивная мысль была, Почему бы не добавить больше аккумуляторов и развернуть еще раз?

Я сделал это и заметил, что уменьшение сокращения средних циклов на элемент уменьшалось.

Мой вопрос: Почему?

A: Это потому, что у нас заканчиваются регистры для работы одновременно, а информация должна храниться в памяти?

B: Или это потому, что «цикл очистки» должен обрабатывать больше элементов после развернутого цикла?

Это сочетание A и B?

+0

Не забывайте, что разгрузка кладет большую нагрузку на кеш инструкций. –

+0

Не кеш команд L1 достаточно велик, чтобы обрабатывать 16 неподписанных ints? Поскольку я иду от 8 до 16 аккумуляторов/разворачиваний, это преимущество незначительно. – SSOPLIF

+0

@filposs: Кэш трассировки, конечно же, нет. Я думаю, что он подходит только для 50-100 мкп. – Dolda2000

ответ

3

Я не уверен, если я просто констатирую очевидные здесь, но главной причины, почему вы видите убывающую отдачу от разворачивания просто потому, что вы в значительной степени устранены накладные расходы из цикла, и оставшееся время на CPU тратится почти полностью на «полезную» работу, которую вы делаете.

Преимущество разворачивания заключается в том, что вы устраняете накладные расходы самого цикла - то есть, приращение индекса, сравнения, ветвление, & c. - не то, что он делает полезную работу цикла быстрее. Когда вы достигли точки, в которой основные издержки цикла в основном устранены, должно быть очевидно, что вы не увидите дальнейших улучшений от более разворачивания.

С другой стороны, есть некоторые аспекты дальнейшего разворота, что ухудшает производительность, например, регистры, разливающиеся в память, I-кеш работает менее эффективно, причем цикл слишком велик для кэша трассировки (на процессорах это спорт такой), & c.

+0

Очевидный для вас, не столь очевидный для новичка. Спасибо – SSOPLIF

+0

Извините, я только предположил, что это будет первый абзац любого материала, который вы читали. :) – Dolda2000

+0

Различные университеты Powerpoints, go figure :) – SSOPLIF

1

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

+0

Что именно происходит, когда у вас заканчиваются регистры? Я новичок в аппаратной части вещей. Он не хранится в DRAM, правильно? Потому что для получения чего-то из DRAM требуется ~ 1000 циклов.Сохраняется ли наша информация в кеше ближе к процессору? – SSOPLIF

+0

@fliposs: Да, обычно. Большинство процессоров в эти дни имеют кэш L1, L2 и L3, прежде чем они появятся в основной памяти. Вот интересный разговор, чтобы вы начали: https://www.youtube.com/watch?v=WDIkqP4JbkE – jschultz410

+0

Приветствия! – SSOPLIF

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