|
Лишние NOP в ассемблерном коде |
|
|
|
 |
Ответов
|
Nov 22 2007, 14:13
|
Частый гость
 
Группа: Новичок
Сообщений: 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; } }
|
|
|
|
|
Nov 22 2007, 14:49
|

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

|
Цитата(Degun @ Nov 22 2007, 17:13)  Уважаемый qxov я сделал вашу функцию calcModes с применением DMA. На изображении с разрешением 640*480 пикселей она выполняется за 10.2 мсек.
Для сравнения неоптимизированный код для того же изображения выполняется за 102 мсек, т. е. оптимизация даёт десятикратный выигрыш. Скорее всего, простои на ожидание окончания работы DMA + накладные расходы, связанные с DAT модулем. Нужно интегрировать с какими-нибудь другими расчетами - тогда это замедление не будет так сильно сказываться. На глаз раз в 50 сами вычисления быстрее должны производиться, но это - грубо, могу ошибиться, просто спешу сейчас. Но точно сами вычисления значительно быстрее проходят.
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|