Страницы

Поиск по вопросам

вторник, 17 декабря 2019 г.

Оптимизация петель методом Даффа, кто-нибудь применял его на практике?

#c #оптимизация


Оригинальный copypaste. Функция копирования по указателю.
register short *to, *from;
    register count;
    {
        register n=(count+7)/8;
        switch(count%8){
        case 0: do{ *to = *from++;
        case 7:     *to = *from++;
        case 6:     *to = *from++;
        case 5:     *to = *from++;
        case 4:     *to = *from++;
        case 3:     *to = *from++;
        case 2:     *to = *from++;
        case 1:     *to = *from++;
            }while(--n>0);
        }
    }

Выгода очевидна. Петля распараллеливается, следовательно уменьшается количество сравнений
с условием цикла и благодаря switch без break первый проход можно начать из любой точки,
что позволяет без проблем копировать количество байт не кратное количеству строк внутри
петли, при этом оставив ее параллельной.
Кто-нибудь замерял насколько код выше работает быстрее обычной петли снизу?
do {                        
    *to = *from++;        
} while(--count > 0);
    


Ответы

Ответ 1



Во-первых "быстро" и "вывод в порт" - это не совместимые понятия. На вывод в порт потратится сколько тактов, что разница от разворачивания цикла будет не заметна. Во-вторых, если рассматривать копирование вообще, то быстрее будет копировать не 8 раз по байту, а 1 раз по uint64_t, или самый широкий тип, который пролазит в шину памяти. И наконец, при использовании устройства Даффа, каждая итерация цикла будет начинаться на не выровненных данных, что может несколько уменьшить производительность копирования.

Комментариев нет:

Отправить комментарий