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

 
 
> Лишние 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
Ответов
Degun
сообщение Nov 22 2007, 14:13
Сообщение #2


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

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



Уважаемый qxov я сделал вашу функцию calcModes с применением DMA. На изображении с разрешением 640*480 пикселей она выполняется за 10.2 мсек.
Код
#include <stdlib.h>
#include <csl_dat.h>

#define IMG_WIDTH  640
#define IMG_HEIGHT 480

// Буферы для кэширования строк изображения
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;

    //Open DAT-chanel
    DAT_open(DAT_CHAANY, DAT_PRI_HIGH, 0);

    //Загрузка первой строки изображения
    Uint32 id_LoadTransfer = DAT_copy(image[0], ModesBuf[0], IMG_WIDTH);
    //Начальная инициализация идентификатора канала сохранения
    Uint32 id_SaveTransfer=DAT_XFRID_WAITNONE;

    //кольцевой указатель на буфер текущей строки
    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;
        //Ожидание окончания загрузки текущей строки изображения
        while(DAT_busy(id_LoadTransfer));
        //Запуск загрузки следующей строки изображения
        id_LoadTransfer = DAT_copy(image[y+1], ModesBuf[iCurrBufIndex], IMG_WIDTH);
        //обработка текущей строки
//#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

            // Здесь получаем, что 4L и 4M юнита - два цикла; еще осталось 4S и 4D, 2D на загрузку
            // уйдет -> остается 4S и 2D юнита, для внутренностей цикла надо 4LSD => останется два S
            // юнита на поддержание цикла. Теоретически, производительность кода - 2 такта на 8 пикселов
            // или 0.25 такта на пиксел. При этом удалось добиться соответствия со значениями мод из
            // оригинального кода, добавив лишь одно ограничение по - количество пикселей должно быть кратно 8.
            // Следует также отметить, что даже при больших размерах изображения, не возникает простоя из-за
            // того, что данные не находятся в кэше.
        }
        //Ожидание окончания сохранения результата
        while(DAT_busy(id_SaveTransfer));
        //Сохранение строки результата
        id_SaveTransfer = DAT_copy(pCurrLineBuf, modes[y], IMG_WIDTH);
    }

    //Ожидание окончания сохранения результата
    while(DAT_busy(id_SaveTransfer));

    //Close DAT-chanel
    DAT_close();
}

Для сравнения неоптимизированный код для того же изображения выполняется за 102 мсек, т. е. оптимизация даёт десятикратный выигрыш.
Код
#include <stdlib.h>

//Функция, классифицирующая пикселы изображения по модам
void SplitImage2Modes(unsigned char ** restrict image, unsigned char ** restrict modes,
    int height, int width, int thresold1, int thresold2)
{
    if ((image==NULL)||(modes==NULL)) return;

    //цикл по всем пикселам изображения
    for(int y=0; y<height; y++) for(int x=0; x<width; x++)
    {
        int pixel=image[y][x];
        if (pixel<thresold1)
            modes[y][x]=0;
        else if (pixel>thresold2)
            modes[y][x]=1;
        else
            modes[y][x]=-1;
    }
}
Go to the top of the page
 
+Quote Post
qxov
сообщение Nov 22 2007, 14:49
Сообщение #3


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

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



Цитата(Degun @ Nov 22 2007, 17:13) *
Уважаемый qxov я сделал вашу функцию calcModes с применением DMA. На изображении с разрешением 640*480 пикселей она выполняется за 10.2 мсек.

Для сравнения неоптимизированный код для того же изображения выполняется за 102 мсек, т. е. оптимизация даёт десятикратный выигрыш.

Скорее всего, простои на ожидание окончания работы DMA + накладные расходы, связанные с DAT модулем. Нужно интегрировать с какими-нибудь другими расчетами - тогда это замедление не будет так сильно сказываться. На глаз раз в 50 сами вычисления быстрее должны производиться, но это - грубо, могу ошибиться, просто спешу сейчас. Но точно сами вычисления значительно быстрее проходят.
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
- - qxov   А можно ли считать, что за пределами кадра есть ра...   Nov 22 2007, 20:00
|- - Degun   Цитата(qxov @ Nov 22 2007, 23:00) А можно...   Nov 23 2007, 11:58
|- - qxov   Цитата(Degun @ Nov 23 2007, 14:58) Да впо...   Nov 23 2007, 12:50
|- - Degun   Цитата(qxov @ Nov 23 2007, 15:50) Точно 7...   Nov 25 2007, 17:44
|- - 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 Текстовая версия Сейчас: 22nd June 2025 - 16:43
Рейтинг@Mail.ru


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