23.06.2018, 13:31 [+3 UTC]
в нашей команде: 2 854 чел. | участники онлайн: 2 (рекорд: 21)

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

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

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

:: правила

:: новости

:: участники

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

:: форум

:: блоги

:: поиск

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

:: наш журнал

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

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

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

:: поддержка

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

Версия системы:
7.47 (16.04.2018)

Общие новости:
13.04.2018, 10:33

Форум:
18.06.2018, 08:55

Последний вопрос:
23.06.2018, 07:43

Последний ответ:
23.06.2018, 07:26

Последняя рассылка:
23.06.2018, 00:45

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

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

Наша кнопка:

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

Отзывы о нас:
16.03.2012, 15:28 »
Сергей К.
Спасибо. Да, в понедельник сгоняю в поликлинику. [вопрос № 185604, ответ № 270240]

РАЗДЕЛ • Assembler

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

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

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

Зенченко Константин Николаевич
Статус: Модератор
Рейтинг: 273
cain52
Статус: 1-й класс
Рейтинг: 4
Лысков Игорь Витальевич
Статус: Старший модератор
Рейтинг: 0

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

Консультация онлайн # 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.14493 сек.

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