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

Частый гость
 
Группа: Свой
Сообщений: 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 с хвостиком должно выходить. Ну пусть в два раза ошиблись, но не на столько же... Оптимизация-то включена?
|
|
|
|
|
Nov 25 2007, 17:44
|
Частый гость
 
Группа: Новичок
Сообщений: 84
Регистрация: 4-09-07
Из: Москва
Пользователь №: 30 277

|
Цитата(qxov @ Nov 23 2007, 15:50)  Точно 7.9 мсек? Просто 7.9 мсек на 500МГц - 3950000 циклов, что многовато для обработки 640*480=307200 пикселов изображения - более 128 циклов на пиксел, а расчетное - около 0.25 с хвостиком должно выходить. Ну пусть в два раза ошиблись, но не на столько же... Оптимизация-то включена?  Точно 7.9 мсек. Может быть где-то в настройках DSP-BIOS стоит опция размещать статические буфера не в IRAM, а в во внешней SDRAM. Возможно именно из-за этого такое большое время выполнения.
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|