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

 
 
> Лишние NOP в ассемблерном коде
Degun
сообщение Oct 23 2007, 11:54
Сообщение #1


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

Группа: Новичок
Сообщений: 84
Регистрация: 4-09-07
Из: Москва
Пользователь №: 30 277



Code Composer Studio v 3.3; Процессор DM642 на evalution board.
Имеется программка, написанная на C++. После анализа её ассемблерного кода выяснилось, что после многих команд (LDW, ADD, CMPLT, AND, LDHU и др.) компилятор вставляет команду NOP, что естественно замедляет функционирование программы. Для чего это? Можно ли отключить вставку операторов NOP в ассемблерный код?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
qxov
сообщение Nov 22 2007, 20:00
Сообщение #2


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

Группа: Свой
Сообщений: 86
Регистрация: 22-03-07
Из: Санкт-Петербург
Пользователь №: 26 406



А можно ли считать, что за пределами кадра есть рамка размером в один пиксел со значением, скажем, 0?
Go to the top of the page
 
+Quote Post
Degun
сообщение Nov 23 2007, 11:58
Сообщение #3


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

Группа: Новичок
Сообщений: 84
Регистрация: 4-09-07
Из: Москва
Пользователь №: 30 277



Цитата(qxov @ Nov 22 2007, 23:00) *
А можно ли считать, что за пределами кадра есть рамка размером в один пиксел со значением, скажем, 0?

Да вполне.

Цитата(qxov @ Nov 22 2007, 17:49) *
Скорее всего, простои на ожидание окончания работы DMA + накладные расходы, связанные с DAT модулем. Нужно интегрировать с какими-нибудь другими расчетами - тогда это замедление не будет так сильно сказываться. На глаз раз в 50 сами вычисления быстрее должны производиться, но это - грубо, могу ошибиться, просто спешу сейчас. Но точно сами вычисления значительно быстрее проходят.

Попробовал вариант, в котором убрал все обращения к внешней памяти через DMA, а только к внутреннему static буферу. Этот варинат выполнился за 7.9 мсек. Не понимаю тогда где задержка?
Код
#include <stdlib.h>

#include "cs_common.h"

// Буферы для кэширования строк изображения
static unsigned char ModesBuf[3][IMG_WIDTH];

//Функция, классифицирующая пикселы изображения по модам
void SplitImage2Modes(unsigned char ** restrict image, unsigned char ** restrict modes,
    int thresold1, int thresold2)
{
    //Рабочие регистры цикла
    int lockPixels, compareLo, compareHi, result1, result2;
    unsigned char * restrict pCurrLineBuf;
    double pixels;

    //кольцевой указатель на буфер текущей строки
    int iCurrBufIndex=0;

    //пакеты порогов
    int thresoldLo=_packl4(_pack2(thresold1,thresold1),_pack2(thresold1,thresold1));
    int thresoldHi=_packl4(_pack2(thresold2,thresold2),_pack2(thresold2,thresold2));

    //цикл по всем строкам изображения
//#pragma MUST_ITERATE(IMG_HEIGHT, IMG_HEIGHT);
    for(int y=0; y<IMG_HEIGHT; y++)
    {
        //Указатель на текущую обрабатываемую строку
        pCurrLineBuf = ModesBuf[iCurrBufIndex];
        //Продвижение индекса на следующую строку
        iCurrBufIndex++; iCurrBufIndex%=3;
        //обработка текущей строки
//#pragma MUST_ITERATE(IMG_WIDTH/8, IMG_WIDTH/8);
        for(int x=0; x<IMG_WIDTH; x+=8)
        {
            // Загрузим сразу 8 пикселов
            pixels=_amemd8_const(pCurrLineBuf+x);                  // D

            //Первые четыре пиксела
            lockPixels=_lo(pixels);

            // Если пиксел >= thresold1, то в соответсвующем байте будет 0xff
            compareLo=_xpnd4(_cmpgtu4(lockPixels,thresoldLo));     // L + M

            // Если пиксел >= thresold2, то в соответсвующем байте будет 0xff
            compareHi=_xpnd4(_cmpgtu4(lockPixels,thresoldHi));     // L + M

            // Здесь очень удачно все сложилось - возможны три варианта:
            // если пиксел>=thresold1 и пиксел<thresold2, то получится 0xff ^ 0x00 = 0xff = -1;
            // если пиксел>=thresold1 и пиксел>=thresold2, то получится 0xff ^ 0xfe = 0x01
            // если пиксел<thresold, то пиксел<thresold2 и получается 0x00 ^ 0x00 = 0x00
            result1=compareLo ^ (compareHi & 0xfefefefe);          // LSD + LSD

            // Здесь все тоже самое, для оставшихся четырех пикселов
            lockPixels=_hi(pixels);

            compareLo=_xpnd4(_cmpgtu4(lockPixels,thresoldLo));     // L + M
            compareHi=_xpnd4(_cmpgtu4(lockPixels,thresoldHi));     // L + M

            result2=compareLo ^ (compareHi & 0xfefefefe);          // LSD + LSD

            // Сохраним результат
            _amemd8(pCurrLineBuf+x)=_itod(result2,result1);        // D
        }
    }
}
Go to the top of the page
 
+Quote Post
qxov
сообщение Nov 23 2007, 12:50
Сообщение #4


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

Группа: Свой
Сообщений: 86
Регистрация: 22-03-07
Из: Санкт-Петербург
Пользователь №: 26 406



Цитата(Degun @ Nov 23 2007, 14:58) *
Да вполне.
Попробовал вариант, в котором убрал все обращения к внешней памяти через DMA, а только к внутреннему static буферу. Этот варинат выполнился за 7.9 мсек. Не понимаю тогда где задержка?

Точно 7.9 мсек?
Просто 7.9 мсек на 500МГц - 3950000 циклов, что многовато для обработки 640*480=307200 пикселов изображения - более 128 циклов на пиксел, а расчетное - около 0.25 с хвостиком должно выходить. Ну пусть в два раза ошиблись, но не на столько же... Оптимизация-то включена? smile.gif
Go to the top of the page
 
+Quote Post
Degun
сообщение Nov 25 2007, 17:44
Сообщение #5


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

Группа: Новичок
Сообщений: 84
Регистрация: 4-09-07
Из: Москва
Пользователь №: 30 277



Цитата(qxov @ Nov 23 2007, 15:50) *
Точно 7.9 мсек?
Просто 7.9 мсек на 500МГц - 3950000 циклов, что многовато для обработки 640*480=307200 пикселов изображения - более 128 циклов на пиксел, а расчетное - около 0.25 с хвостиком должно выходить. Ну пусть в два раза ошиблись, но не на столько же... Оптимизация-то включена? smile.gif

Точно 7.9 мсек. Может быть где-то в настройках DSP-BIOS стоит опция размещать статические буфера не в IRAM, а в во внешней SDRAM. Возможно именно из-за этого такое большое время выполнения.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Degun   Лишние NOP в ассемблерном коде   Oct 23 2007, 11:54
- - fontp   Цитата(Degun @ Oct 23 2007, 15:54) Code C...   Oct 23 2007, 12:04
|- - Degun   Цитата(fontp @ Oct 23 2007, 16:04) Это не...   Oct 23 2007, 12:15
|- - fontp   Цитата(Degun @ Oct 23 2007, 16:15) А разв...   Oct 23 2007, 12:28
|- - Edmundo   Цитата(Degun @ Oct 23 2007, 16:15) Не сов...   Oct 24 2007, 12:36
|- - Degun   А вообще можете посоветовать: 1. каких правил или ...   Oct 24 2007, 19:24
|- - Degun   Что можно сделать или оптимизировать в функции ниж...   Oct 26 2007, 12:06
|- - fontp   Неприятный какой алгоритм, сплошные условные опера...   Oct 26 2007, 12:40
||- - Degun   Как известно у TI C6000-го семейства 8 конвейеров....   Oct 30 2007, 20:12
||- - Edmundo   Цитата(Degun @ Oct 30 2007, 23:12) Как из...   Oct 30 2007, 20:32
||- - Degun   Цитата(Edmundo @ Oct 30 2007, 23:32) Куча...   Oct 31 2007, 06:29
||- - fontp   Цитата(Degun @ Oct 31 2007, 09:29) Если ц...   Oct 31 2007, 08:42
||- - Degun   Цитата(fontp @ Oct 31 2007, 11:42) Ну, он...   Oct 31 2007, 19:50
||- - fontp   Цитата(Degun @ Oct 31 2007, 22:50) А есть...   Oct 31 2007, 20:20
||- - Degun   Цитата(fontp @ Oct 31 2007, 23:20) Короче...   Nov 7 2007, 19:59
||- - fontp   Цитата(Degun @ Nov 7 2007, 22:59) Что-то ...   Nov 8 2007, 07:33
||- - vadkudr   Цитата(Degun @ Nov 8 2007, 04:59) Что-то ...   Nov 20 2007, 13:33
||- - SIA   Цитата(Degun @ Nov 7 2007, 22:59) Что-то ...   Mar 17 2008, 17:09
|- - qxov   Цитата(Degun @ Oct 26 2007, 16:06) Что мо...   Nov 16 2007, 10:07
|- - Degun   Цитата(qxov @ Nov 16 2007, 13:07) Я хотел...   Nov 16 2007, 13:08
|- - qxov   Цитата(Degun @ Nov 16 2007, 16:08) Задача...   Nov 16 2007, 21:53
||- - Degun   Цитата(qxov @ Nov 17 2007, 00:53) Вот пло...   Nov 17 2007, 10:54
|- - qxov   Цитата(Degun @ Nov 16 2007, 16:08) Алгори...   Nov 18 2007, 13:15
|- - qxov   Как успехи? Вот, набросал на коленке кусочек. Може...   Nov 19 2007, 20:42
|- - Degun   Цитата(qxov @ Nov 17 2007, 00:53) Вот так...   Nov 20 2007, 17:38
- - mdmitry   Возможно оффтор! В MATLAB ImageProcessing Tool...   Nov 18 2007, 11:09
- - Degun   Уважаемый qxov я сделал вашу функцию calcModes с п...   Nov 22 2007, 14:13
|- - qxov   Цитата(Degun @ Nov 22 2007, 17:13) Уважае...   Nov 22 2007, 14:49
|- - qxov   Цитата(Degun @ Nov 25 2007, 20:44) Точно ...   Nov 26 2007, 07:41
|- - Degun   Цитата(qxov @ Nov 26 2007, 10:41) Я в DSP...   Nov 26 2007, 12:19
- - qxov   Не знаю, на сколько этот вариант подходит: если m...   Nov 26 2007, 19:07
|- - Degun   Цитата(qxov @ Nov 26 2007, 22:07) Не знаю...   Nov 27 2007, 12:26
|- - qxov   Цитата(Degun @ Nov 27 2007, 15:26) Вообще...   Nov 28 2007, 06:07
|- - Degun   Цитата(qxov @ Nov 28 2007, 09:07) Начинат...   Dec 6 2007, 17:40
|- - qxov   Цитата(Degun @ Dec 6 2007, 20:40) Такие с...   Dec 7 2007, 06:20
|- - Degun   Вот такой у меня получился код для DSP. Но для изо...   Feb 1 2008, 12:43
- - Николай Z   Цитата(Degun @ Oct 23 2007, 14:54) Code C...   Dec 6 2007, 23:23
- - qxov   Очень тяжелый вложенный цикл. Нужно рассмотреть во...   Feb 13 2008, 10:16
|- - Degun   Цитата(qxov @ Feb 13 2008, 13:16) Очень т...   Feb 19 2008, 12:55
- - Degun   Следующий вариант выполняется на 1 мсек быстрее, ч...   Mar 17 2008, 13:29


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

 


RSS Текстовая версия Сейчас: 20th June 2025 - 17:56
Рейтинг@Mail.ru


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