Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Nios: burts и побайтные операции
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
edren_baton
Всем доброго времени суток!

У меня есть задача провести побайтные операции с двумя массивами данных в памяти (SDRAM или DDR3) и записать их в новую область памяти.

Варианты исполнения такой функции (например, вычитание), написанные мною в "лоб" приведены ниже. Объявления переменных и т.п. опустил.
В первом случае из памяти данные считываются побайтно и побайтно же записываются. Во втором считывается 4 байта, идет шаманство со сдвигами и запись результата как 4х байт.

Код
void difference(alt_u8* buffer1, alt_u8* buffer2, alt_u8* buffer3)
{
     for (cntr = 0; cntr < 4; cntr++)
        {
                  *buffer3 = *buffer2 - *buffer1
            
                        buffer1 = buffer1 + 1;
            buffer2 = buffer2 + 1;
            buffer3 = buffer3 + 1;
        }
}



Код
void difference2(alt_u32* buffer1, alt_u32* buffer2, alt_u32* buffer3)
{
             buf_1_1 = *buffer1;
            buf_1_2 = *buffer2;

            buf_2_1 = *buffer1 >> 8;
            buf_2_2 = *buffer2 >> 8;

            buf_3_1 = *buffer1 >> 16;
            buf_3_2 = *buffer2 >> 16;

            buf_4_1 = *buffer1 >> 24;
            buf_4_2 = *buffer2 >> 24;
    
            buf_1 = abs (buf_1_2 - buf_1_1);
            buf_2 = abs (buf_2_2 - buf_2_1);
            buf_3 = abs (buf_3_2 - buf_3_1);
            buf_4 = abs (buf_4_2 - buf_4_1);

            buf_0 = 0x00000000;
            buf_0 |= buf_4;

            buf_0 = buf_0 << 8;
            buf_0 |= buf_3;

            buf_0 = buf_0 << 8;
            buf_0 |= buf_2;

            buf_0 = buf_0 << 8;
            buf_0 |= buf_1;

            *buffer3 = buf_0;
}


Вопрос. Что из этого работает быстрее (в т.ч. с точки зрения обращения к памяти). Или же как по-другому адекватно проводить такие побайтные операции именно в Nios?
Golikov A.
компилируете, переводите в ассемблер, считаете количество ассемблерных команд... Где меньше то и быстрее...
alexadmin
Цитата(Golikov A. @ Mar 2 2015, 18:05) *
компилируете, переводите в ассемблер, считаете количество ассемблерных команд... Где меньше то и быстрее...


Лучше тест запустить и секундомером померять. Ассемблерные команды не учтут задержку памяти и влияние кэша. Вообще, если кэш есть - я бы оставил первый вариант.

edren_baton, поставьте аппаратный тамер и проверьте - дел на 10 минут.
EugeneS
QUOTE (alexadmin @ Mar 2 2015, 18:10) *
Лучше тест запустить и секундомером померять. Ассемблерные команды не учтут задержку памяти и влияние кэша. Вообще, если кэш есть - я бы оставил первый вариант.

edren_baton, поставьте аппаратный тамер и проверьте - дел на 10 минут.


А что, в случае кэша byte select & burst к DDR ведут себя как-то по другому?
Timmy
Цитата(EugeneS @ Mar 3 2015, 11:56) *
А что, в случае кэша byte select & burst к DDR ведут себя как-то по другому?

Абсолютно по-другому, без кэша загрузка каждого байта будет порождать полный цикл доступа к внешней памяти.
Кстати, побайтно вычесть два 32-битных слова вроде бы можно так:
Код
((a|0xFF00FF00) - (b&0x00FF00FF)) & 0x00FF00FF |
((a|0x00FF00FF) - (b&0xFF00FF00)) & 0xFF00FF00;
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.