реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Nios: burts и побайтные операции
edren_baton
сообщение Mar 2 2015, 14:37
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 81
Регистрация: 13-10-08
Пользователь №: 40 915



Всем доброго времени суток!

У меня есть задача провести побайтные операции с двумя массивами данных в памяти (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?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Mar 2 2015, 15:05
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



компилируете, переводите в ассемблер, считаете количество ассемблерных команд... Где меньше то и быстрее...
Go to the top of the page
 
+Quote Post
alexadmin
сообщение Mar 2 2015, 15:10
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 572
Регистрация: 17-11-05
Из: СПб, Россия
Пользователь №: 10 965



Цитата(Golikov A. @ Mar 2 2015, 18:05) *
компилируете, переводите в ассемблер, считаете количество ассемблерных команд... Где меньше то и быстрее...


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

edren_baton, поставьте аппаратный тамер и проверьте - дел на 10 минут.
Go to the top of the page
 
+Quote Post
EugeneS
сообщение Mar 3 2015, 08:56
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 181
Регистрация: 28-08-04
Пользователь №: 557



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

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


А что, в случае кэша byte select & burst к DDR ведут себя как-то по другому?
Go to the top of the page
 
+Quote Post
Timmy
сообщение Mar 3 2015, 10:52
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 835
Регистрация: 9-08-08
Из: Санкт-Петербург
Пользователь №: 39 515



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

Абсолютно по-другому, без кэша загрузка каждого байта будет порождать полный цикл доступа к внешней памяти.
Кстати, побайтно вычесть два 32-битных слова вроде бы можно так:
Код
((a|0xFF00FF00) - (b&0x00FF00FF)) & 0x00FF00FF |
((a|0x00FF00FF) - (b&0xFF00FF00)) & 0xFF00FF00;
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 22:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.0138 секунд с 7
ELECTRONIX ©2004-2016