|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Янв 12, 2004 15:29:07 Edmond S_T_A_S_ Ну так есть готовый исходник, плевать на степень общности? А то малтимидия мне на 64 тормоза вставляет: 3 такта на доставку в малтимидиа юнит, 3 обратно. Из-за этого 8 байт крутятся в конвеере 3 итерации, а могли бы 2! Скорость тогда была бы 4 байта за такт, а если 4 итерации - то 8-8*(1/4)=6 (чертверть на bubbles) Как тока кто покажет - сразу перепишу. Вот это сравнение одним махом будет! |
|
|
Дата: Янв 12, 2004 16:00:55 volodya Спасибо, перепишу на асм, посмотрим... :)) Но я тебе советую посмотреть мой вариант.. (правда там только сравнение с 1 символом, но смысл в принципе тот же) где-то в ULIB я кидал... |
|
|
Дата: Янв 12, 2004 16:22:51 Valery Я уже с этим совсем запутался :) Как хорошо буржуям с их всеобъемлющим you ;) Edmond Как там с "тем" исходником? А то мне все покоя не дают эти XORы :) Хотя, имхо, уже кажется "одним махом" сложновато - все упирается в разницу между какой-либо границей и аргументом. Если она > 80 то результат отличается от того, когда она меньше (уже и сам запутался) Возможное решение для некоторых последовательностей (требует дополнительных проверок) - немного "размазать границы": shr ecx and ecx, 7f7f7f7fh ;; теперь сравниваем. Границы тоже надо сдвинуть. Если нашли, то доп. точная проверка |
|
|
Дата: Янв 12, 2004 16:57:09 Что-то пошли темы о компиляторах :)) Ага, а это подсказка или нет? Может все символы 20<=x<80h ? :) И еще. Каков будет примерный результат sub edi, esi? А то может Valery напрасно такты считает, там 50 Мб надо сканировать? |
|
|
Дата: Янв 12, 2004 17:08:31 S_T_A_S_ "одним махом" не бывает напрасно:) Да, неплохо бы потребовать от вызывающего хорошего выравнивания. |
|
|
Дата: Янв 12, 2004 17:15:53 S_T_A_S_ Что-то Edmond придумал с XOR, но молчит :) Ну хорошо, просто нет времени, извини. Всё тупо... Смотрим раз 1. Есть число 4 байта Обозначим эти байта x1,x2,x3,x4 x4x3x2x1 -- 4 байта Итак, мы должны сравнить поток из 4-х чисел c числом y Например нужно провреить условие, xx < y Если выполнить операцию вычитания, x4x3x2x1 - yyyyyyyy То если хотя бы в одном случае условие выполнится, происходит переполнение. !!!!! Вот именно на этом эффекте и построен алгоритм. Далее, дело техники. XOR нужен для учёта знаков. То есть если xx-yy == -xx-yy == -xx-(-yy) == А вот если известно, что yy > 0, тогда, процедура очень проста. Без XOR |
|
|
Дата: Янв 12, 2004 17:17:45 Valery Я всегда соблюдаю выравнивание. его можно соблюсти програмно. |
|
|
Дата: Янв 12, 2004 17:20:33 Если она > 80 то результат отличается от того, когда она меньше (уже и сам запутался) Вот для этого XOR и нужен!!!!!!!!!!!!! Он учитывает знак... Если бит знака x1 == 0 И бит знака yy == 0 тогда условие выполнения Бит результата == 1 Если бит знака x1 == 1 И бит знака yy == 1 тогда условие выполнения Бит результата == 1 Если бит знака x1 == 0 И бит знака yy == 1 тогда условие выполнения Бит результата == 0 Если бит знака x1 == 1 И бит знака yy == 0 тогда условие выполнения Бит результата == 1 Я надеюсь уже понятнее стало? Ой, бегу, бегу.. Прошу прощения.... убегаю :)) |
|
|
Дата: Янв 12, 2004 18:36:34 · Поправил: Valery Ну вот это другое дело! Нам нужен хотя бы один факт переполнения, а не его отсутствие где либо. Это слабее, чем параллельная операция, но для наших целей достаточно. А то я кретин уже хотел доказывать теорему "Параллельная операция cmp сводима к не более чем трем обычным"!:) |
|
|
Дата: Янв 12, 2004 19:26:08 Edmond А-А-А-А-А!!!!! каких-то 2 долбаных XORа (по одному на границу) отделяли меня от результата. И я свернул с пути.. Valery Да, Edmond и мне объяснил мои мысли лучше, чем я сам их понял :) (см. мой первый пример) |
|
|
Дата: Янв 12, 2004 20:32:59 bsl_zcs mov ecx,eax / xor ecx,eax - тут опечатка, edx вместо eax надо в одной из команд. А я тоже думал, что за хрень ;) |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.066 |