2014-09-19 8 views
1

Я попытался написать алгоритм сортировки для инструкций по переупорядочению для процессора с двумя проблемами (Cell SPU). Один из способов получить двойную задачу обработки инструкции не должен зависеть от предшествующей ей инструкции (другой - отдельные конвейеры, но я сосредоточен на инструкциях в том же конвейере). Я понимаю, что это было бы слишком сложно для компилятора, и я не нашел то, что мне нужно при поиске. Это может быть сделано вручную в большинстве случаев, но алгоритм сортировки должен обеспечивать самый низкий «счет последовательности» (число или зависимые инструкции, которые следуют друг за другом).Инструкции по сортировке/переупорядочению для обработки двойных выпусков

У меня вопрос, было ли это или что-то подобное сделано раньше? Существует ли оптимизированный подход?

Простого примера время инструкции псевдокод сращивание (входы: i1, i2, i3):

v1 = i1^i2; - #single-issued 
v2 = v1 | i2; \ #v2,v3 dual-issued 
v3 = i1 & i3;/#v2,v3 dual-issued 
v4 = v3 & i2; - #single-issued 

можно записать в виде:

v1 = i1^i2; \ #v1,v3 dual-issued 
v3 = i1 & i3;/#v1,v3 dual-issued 
v2 = v1 | i2; \ #v2,v4 dual-issued 
v4 = v3 & i2;/#v2,v4 dual-issued 

Вот реализация Python Я создал рекурсивно сортирует инструкцию к достичь наименьшего "количества последовательностей".

reorder.py
http://pastebin.com/dt8eWy3H

образец t8-1.h
http://pastebin.com/w0DYg8ff

ответ

1

Пока я не могу говорить конкретно для Cell, планирования код АБСОЛЮТНО то, что компилятор должен делать для вас ,

Составители будут переупорядочивать инструкции, вставлять NOPS по мере необходимости и делать все возможное, чтобы обеспечить хорошее расписание для вас. Как правило, я бы сказал вам посмотреть параметры «mtune» для вашего компилятора (они позволяют рассказать вашему компилятору точно, как выглядит ваш процессор), но поскольку вы кодируете Cell, он уже должен знать, что делать (но обязательно проверьте руководство для компилятора).

Беглый взгляд на GCC компилятор для SPU here показывает такие параметры, как:

-mdual-nops=n 
    By default, GCC inserts nops to increase dual issue when 
    it expects it to increase performance. n can be a value from 
    0 to 10. A smaller n inserts fewer nops. 10 is the default, 0 
    is the same as -mno-dual-nops. Disabled with -Os. ` 

Как программист, это ваша работа, чтобы обеспечить достаточное количество «ILP» в вашем коде, чтобы получить хорошее планирование. Старайтесь избегать ветвей, избегайте длительных латентных операций на критическом пути и т. Д., И вы должны быть в порядке. Проанализируйте objdump критических циклов, чтобы проверить, что код запланирован по вашему желанию. Компилятор очень умный, но это может потребовать небольшого уговоров.

+0

NOPS не проблема, БПК компилятор (CC = сп-ССАГПЗ/AS = сп-а) не были достаточно умны, чтобы изменить порядок инструкций. – frankiek3

1

Я закончил использовать java-программу 'Assembly Visualizer' asmVis.jar для просмотра разделов сборки, которые можно было оптимизировать, и я вручную переупорядочил инструкции. Я значительно увеличил скорость сборки, используя как нечетную, так и четную сторону в течение почти каждого цикла команд (с двойным выпуском инструкций).

TODO: добавьте GitHub ссылку на источник