Самый быстрый rep scasd

Тема в разделе "WASM.ASSEMBLER", создана пользователем gilg, 7 фев 2007.

  1. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Собственно, сабж. Можно ли ускорить поиск дворда в строке примерно на порядок при одном из следующих условий (естественно, алгоритмы м.б. разные):
    а) дворд встречается около 10 раз в 4 кб данных
    б) дворд встречается около 4000 раз в 4 кб данных
    в) 0 или 1 раз в 4 кб данных
    г) максимум два раза в 4 Мб данных

    Раельно ли получить выигрыш на порядок, заморочившись оптимизацией, или не стоит тратить времени?
     
  2. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    На порядок (то есть в десять раз) - вряд ли... В три раза - более, чем реально.
     
  3. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Хорошо подумал и решил забить на оптимизацию. Проще оказалось наложить дополнительные ограничения на данные
     
  4. koderr

    koderr New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    205
    Ustus
    Для настоящего ассемблерщика "на порядок" - это "в два раза".
     
  5. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Для настоящего ассемблерщика может быть и в два, но надо было в 10 :)
     
  6. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    koderr
    :)

    gilg
    Заранее сказать трудно - может и в десять получится, без конкретных измерений на современных аццких машинах что-то не угадаешь.
     
  7. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Не удержался - попробовал :)
    на моем рабочем Prescott'е обыкновенная замена циклом раскрученым х4 дает на переборе 4К выигрыш порядка в два раза. Но то, конечно, тот еще танк - на Athlon или новомодном Core 2 такой сладкой халявы уже не будет.

    [offtop]
    и вообще, где leo? :):):)
    позовите слесаря! (с) :):):)
    [/offtop]

    посмотри Фога - это у него рассматривается от и до, как классический случай.
     
  8. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Ustus
    Сенкс, гляну!
     
  9. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    gilg
    Э-э-э... обманул немножко... Я имел ввиду что-то типа фоговского strlen, но у него там работа с БАЙТАМИ упаковаными в DWORD'ы... а с dword'ами даже не знаю - можно попробовать SSE, но что-то мне подсказывает, что нелегко это будет... основная проблема - цикл вида while(xmm0 == 0) - вот что-то торможу и не могу придумать как это эффективно сделать :dntknw:
     
  10. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Ustus
    Потоковые инструкции по-любому не катят - нужна переносимость. Пересмотром алгоритма избавился от третьего вложенного цикла, и все залетало. Иногда все-таки думать полезно бывает :))
     
  11. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    gilg
    Ну... разве что иногда :)
    Все равно у меня на SSE быстрее не получилось, на танке с гордым именем Prescott, во всяком случае.
    Правда, оптимизатор из меня тот еще :) Там сплошная цепочка зависимостей и как ее разгрести - ума не приложу. Что-то типа такого:
    Код (Text):
    1.     ll:
    2.         movdqa      xmm1, [eax][ecx]
    3.         pcmpeqd     xmm1, xmm0
    4.         pmovmskb    ebx, xmm1
    5.         or          ebx, ebx
    6.         jnz         bb
    7.  
    8.         add         ecx, 16
    9.         jnz         ll