17.02.2019, 07:52 [+3 UTC]
в нашей команде: 3 393 чел. | участники онлайн: 7 (рекорд: 21)

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

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

все разделы

правила

новости

участники

доска почёта

форум

блоги

поиск

статистика

наш журнал

наши встречи

наша галерея

отзывы о нас

поддержка

руководство

Версия системы:
7.69 (10.02.2019)
JS-v.1.33 | CSS-v.3.35

Общие новости:
10.02.2019, 21:59

Форум:
16.02.2019, 15:03

Последний вопрос:
16.02.2019, 13:32
Всего: 148762

Последний ответ:
16.02.2019, 15:37
Всего: 257791

Последняя рассылка:
17.02.2019, 06:45

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

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

Наша кнопка:

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

Отзывы о нас:
18.04.2012, 15:03 »
Arman Muratuly
Коротко и ясно. Спасибо. [вопрос № 185839, ответ № 270561]
21.04.2010, 07:58 »
Катя Лапшенкова
Все отлично! Более подробного и обоснованного ответа представить невозмоно!Спасибо Вам!!!!! [вопрос № 177940, ответ № 260942]

РАЗДЕЛ • Assembler

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

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

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

Коцюрбенко Алексей Владимирович
Статус: Модератор
Рейтинг: 751
Зенченко Константин Николаевич
Статус: Старший модератор
Рейтинг: 399
cain52
Статус: 3-й класс
Рейтинг: 267

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

Консультация онлайн # 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
Вiктор

# 1

= общий = | 09.12.2006, 00:55

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

Golden Spider

# 2

= общий = | 09.12.2006, 11:52

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

Bob Johnson

# 3

= общий = | 09.12.2006, 13:20

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

Golden Spider

# 4

= общий = | 09.12.2006, 18:48

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

Bob Johnson

# 5

= общий = | 10.12.2006, 02:03

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

Golden Spider

# 6

= общий = | 10.12.2006, 12:35

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

 

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

Яндекс Rambler's Top100

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

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

© 2001-2019, Портал RFPRO.RU, Россия
Калашников О.А.  |  Гладенюк А.Г.
Версия системы: 7.69 от 10.02.2019
Версия JS: 1.33 | Версия CSS: 3.35