18.02.2018, 12:08 [+3 UTC]
в нашей команде: 2 554 чел. | участники онлайн: 6 (рекорд: 21)

:: РЕГИСТРАЦИЯ

:: задать вопрос

:: все разделы

:: правила

:: новости

:: участники

:: доска почёта

:: форум

:: блоги

:: поиск

:: статистика

:: наш журнал

:: наши встречи

:: наша галерея

:: отзывы о нас

:: поддержка

:: руководство

Версия системы:
7.44 (14.02.2018)

Общие новости:
02.01.2018, 09:46

Форум:
11.02.2018, 23:11

Последний вопрос:
18.02.2018, 10:21

Последний ответ:
17.02.2018, 20:12

Последняя рассылка:
18.02.2018, 05:15

Писем в очереди:
0

Мы в соцсетях:

Наша кнопка:

RFpro.ru - здесь вам помогут!

Отзывы о нас:
09.05.2013, 15:48 »
Wopross
Меня это радует. Спасибо. [вопрос № 187321, ответ № 272239]
15.02.2010, 16:51 »
Кузнецов Валентин Олегович
Боооольшое спасибо за подсказки!!!!!!!!!!!!! И как всегда выручают профессионалы своего дела и конечноже палочка - выручалочка RFpro.ru [вопрос № 176676, ответ № 259452]

РАЗДЕЛ • Assembler

Создание программ на языке Assembler.

[администратор рассылки: Лысков Игорь Витальевич (Старший модератор)]

Лучшие эксперты в этом разделе

Коцюрбенко Алексей aka Жерар
Статус: Мастер-Эксперт
Рейтинг: 391
Лысков Игорь Витальевич
Статус: Старший модератор
Рейтинг: 376
Зенченко Константин Николаевич
Статус: Модератор
Рейтинг: 289

Перейти к консультации №:
 

Консультация онлайн # 66122
Раздел: • Assembler
Автор вопроса: Golden Spider
Отправлена: 08.12.2006, 16:35
Поступило ответов: 2

Уважаемые экперты!!

Мне потребоваль реализовать скоростное копирование значений (тип WORD) из одного массива в другой, кроме тех значений что совпадают с exclude. Вот так выглядит реализация на си. Но мне нужно ещё больше скорости, подскажите реализацию данного алгоритма на ассемблере.

ЗЫ Требуется интеграция в си.

Приложение:

Состояние: Консультация закрыта

Ответ # 130654 от ADSota

Здравствуйте, Golden Spider!

Смело можете писать:
void CopyArrayExclude(WORD * to, WORD * from, int size, WORD exclude){
int i,j=0;
for(i=0;i }
}
На самом деле Си такие конструкции очень сильно оптимизирует в зависимости от контекста в котором используется данная функция - выйгрыша может не получится вообще...

Если очень хочется на ассемблере, то это будет выглядеть примерно так (для массивов средних размеров):
void CopyArrayExclude(WORD * to, WORD * from, int size, WORD exclude){
asm
{
mov bx,exclude
mov di,to;//для 32-х бит: mov edi,to
mov si,from;//для 32-х бит: mov esi,from
xor ecx,ecx
mov cx,size
cld
}
mv:
asm
{
lodsw
or ax,bx
jz mve
stosw
}
mve:
asm loop mv;
}


Консультировал: ADSota
Дата отправки: 08.12.2006, 17:08

Рейтинг ответа:

0

[подробно]

Сообщение
модераторам

Отправлять сообщения
модераторам могут
только участники портала.
ВОЙТИ НА ПОРТАЛ »
регистрация »

Ответ # 130681 от Bob Johnson

Здравствуйте, Golden Spider!
из твоего кода становится понятно, что если исходное значение равно исключаемому, то значение в целевой массив не переписывается, а просто пропускается?
вообще, современные компиляторы С++ действительно хорошо оптимизируют код, так что прежде всего нужно посмотреть, что сгенерит тут компилятор.
на мой взгляд, место для улучшения - это условные переходы. процессор сильно тормозит, если не угадывает условный переход, поэтому условные переходы лучше исключать. предлагаю код в приложении. он не изменяет содержимое ячеек памяти целевого массива, если в исходном на соотв. месте стоит код исключения. если туда можно записывать, например, 0 на это место, код упрощается.
в коде использован метод cmp + sbb для избежания условного перехода.
также можно попробовать реализовать данную задачу с помощью ММХ (оно как раз заточено под 16-ти разрядные числа).

Приложение:


Консультировал: Bob Johnson
Дата отправки: 08.12.2006, 19:55

Рейтинг ответа:

0

[подробно]

Сообщение
модераторам

Отправлять сообщения
модераторам могут
только участники портала.
ВОЙТИ НА ПОРТАЛ »
регистрация »

Мини-форум консультации № 66122

Посетитель

ID: 520

# 1

= общий = | 09.12.2006, 00:55 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

может это и не в тему, но если вы пишете не под обычный компьютер, а под какой-нибудь КПК или смартфон, то может быть там другие приколы с ассемблером, т.е. могут отсутствовать какие-нибудь команды. Так что если вы действительно пишете не для обычного компьютера, то посмотрите справку по ассемблеру используемого процессора.


Посетитель

ID: 9811

# 2

= общий = | 09.12.2006, 11:52 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

действительно пишу для КПК, но асм проверял почти все команды совпадают...


Посетитель

ID: 439

# 3

= общий = | 09.12.2006, 13:20 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

так надо было в вопросе указать... там оптимизация может быть совсем другой (например, стоимость ошибки предугадывания условного перехода не так критична; нет параллельных конвееров и т.п.)


Посетитель

ID: 9811

# 4

= общий = | 09.12.2006, 18:48 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

я проверял скорость выполнения с точностью до миллисекунды скорость действительно возрасла в вашем случае... в 3.7 раза :)


Посетитель

ID: 439

# 5

= общий = | 10.12.2006, 02:03 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

на чем проверял и с чем сравнивал?


Посетитель

ID: 9811

# 6

= общий = | 10.12.2006, 12:35 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

со своей первой функцией. Скорость её выполнения (time1-time2) там получалось несколько десятков миллисекунд, к сожелению ваш вариант ещё не проверил только ADSota, так у него как я уже говорил в несколько раз меньше (время выполниния), по крайней мере для небольших массивов. ЗЫ единственное отличие моего (smartphone) асма от ПК-ного , описывается не asm {}; , а так __asm{}; :)

 

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.

Яндекс Rambler's Top100

главная страница | поддержка | задать вопрос

Время генерирования страницы: 0.14072 сек.

© 2001-2018, Портал RFPRO.RU, Россия
Калашников О.А.  |  Гладенюк А.Г.
Версия системы: 7.44 от 14.02.2018