Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оптимизировать функцию 
:(
    Опции темы
AlexanderV
Дата 31.8.2005, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 31.8.2005
Где: Украина, Киев

Репутация: нет
Всего: нет




Мне надо оптимизировать с помощью встроенного в c++ ассемблера следующюю функцию:

Код

SOMEDLL_API void SomeFunc(ULONG *pBuffer,ULONG *pSource, 
                                                       long StartX, long StartY, 
                                                       long Pitch, long EndY) 
{ 

   pBuffer+=(Pitch*StartY+StartX); 
   register int y; 

   for (y=StartY; y>EndY; y--) 
   { 
      *pBuffer=*pSource; 
      pSource++; 
      pBuffer-=Pitch; 
   }    
    
}


В таком варианте она выполняется слишком медленно. К сожалению, asm я пока вообще не знаю smile , поэтому сюда и обратился.
PM MAIL   Вверх
Дрон
Дата 31.8.2005, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: нет
Всего: 93



Ну, знаешь ли, она на асме намного быстрее не станет.
Тут же просто копирование памяти идёт, а компилятор С++ и так всё оптимизирует по-максимуму.
Кстати, я бы попробовал убрать слово register, т.к. опять же ИМХО компилятору лучше знать, что пихать в регистры.

Это сообщение отредактировал(а) Дрон - 31.8.2005, 15:54


--------------------
Да. Именно так.
PM   Вверх
AlexanderV
Дата 31.8.2005, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 31.8.2005
Где: Украина, Киев

Репутация: нет
Всего: нет



Просто она как-то все равно слишком медленно выполняется...
Подобные действия с помощью memcpy() выполняються раз в 5 быстрее.

Может, дело в том, что pBuffer указывает не на системную, а на видеопамять?
PM MAIL   Вверх
Mayk
Дата 31.8.2005, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: нет
Всего: 134



Разверни цикл, попробуй использовать 64 битные регистры.


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Guest
Дата 31.8.2005, 21:52 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered












А как его развернуть?
Мне же заранее не известно количество итераций.
  Вверх
Mayk
Дата 31.8.2005, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: нет
Всего: 134



Цитата(Guest @ 1.9.2005, 01:52)
А как его развернуть?

Примерно так:

Код

size_t len=StartY-EndY;
size_t len8=(len >> 3); //len8 = len / 8

while(len8--){
    *pBuffer=*pSource++;  pBuffer-=Pitch; 
    *pBuffer=*pSource++;  pBuffer-=Pitch; 
    *pBuffer=*pSource++;  pBuffer-=Pitch; 
    *pBuffer=*pSource++;  pBuffer-=Pitch; 
    *pBuffer=*pSource++;  pBuffer-=Pitch; 
    *pBuffer=*pSource++;  pBuffer-=Pitch; 
    *pBuffer=*pSource++;  pBuffer-=Pitch; 
    *pBuffer=*pSource++;  pBuffer-=Pitch; 
}

switch(len&3){ //len%8
    case 7:   *pBuffer=*pSource++;  pBuffer-=Pitch; 
    case 6:   *pBuffer=*pSource++;  pBuffer-=Pitch; 
    case 5:   *pBuffer=*pSource++;  pBuffer-=Pitch; 
    case 4:   *pBuffer=*pSource++;  pBuffer-=Pitch; 
    case 3:   *pBuffer=*pSource++;  pBuffer-=Pitch; 
    case 2:   *pBuffer=*pSource++;  pBuffer-=Pitch; 
    case 1:   *pBuffer=*pSource;  
}


ps. memcpy кстати подобное делает. Только на асме.

Это сообщение отредактировал(а) Mayk - 31.8.2005, 22:02


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
oleg1973
Дата 1.9.2005, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: нет
Всего: 34



AlexanderV
а как ты видео память копируеш чет я не понял? тоесть прям в примари сурфейсе?
если так то тормоза обеспечены на 100 процентов


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
AlexanderV
Дата 2.9.2005, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 31.8.2005
Где: Украина, Киев

Репутация: нет
Всего: нет



Не, я копирую в другую поверхность, которая потом блиттается с отсечением в первичный буфер. А вообще, а поменял один флажок, и теперь поверхность создается не в видео, а в системной памяти, скорость при этом в 2 раза больше. Кстати, развертка цикла практически никак не ускорила копирование smile
PM MAIL   Вверх
oleg1973
Дата 3.9.2005, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: нет
Всего: 34



ну суть такова
1) рисуй в бэкбуфере
2) НЕ нада ждать эвентов для отрисовки - будет туфта
3) как нарисовал все что надо в бэкбуффере. делаеш лок сурфейса и флип


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0875 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.