Если не ошибаюсь, на этом форуме была большая ветка, где осуществляли разные реализации поиска символа (производная от strlen). Суть алгоритма в чтении нескольких байт в один регистр и, благодаря математическим операциям, вычисления позиции в этом регистре. В обычных регистрах знаю как делать, как делали в SSE - хочу посмотреть и поучиться. Вот в качестве примера реализация на Delphi: Код (Text): function LStrLen(S: PAnsiChar): NativeUInt; label done; const CHARS_IN_CARDINAL = SizeOf(Cardinal) div SizeOf(Byte); SUB_MASK = Integer(-$01010101); OVERFLOW_MASK = Integer($80808080); var Start: PAnsiChar; Align: NativeInt; X, V: NativeInt; begin Start := S; if (S = nil) then goto done; Align := NativeInt(S) and (CHARS_IN_CARDINAL - 1); if (Align <> 0) then repeat if (Byte(S^) = 0) then goto done; Inc(Align); Inc(S); until (Align = CHARS_IN_CARDINAL); repeat X := PCardinal(S)^; Inc(S, CHARS_IN_CARDINAL); V := X + SUB_MASK; X := not X; X := X and V; if (X and OVERFLOW_MASK = 0) then Continue; Dec(S, CHARS_IN_CARDINAL); Inc(S, Byte(Byte(X and $80 = 0) + Byte(X and $8080 = 0) + Byte(X and $808080 = 0))); Break; until (False); done: Result := NativeUInt(S) - NativeUInt(Start); end;
DevilDevil, Эти мат. блоки предназначены для быстрых вычислений, но не для каких то делений их содержимого на части и подобных манипуляций. Сделать можно что угодно перезагружая контекст математики. Но тогда пропадает смысл его использования. IA v.1 > была большая ветка, где осуществляли разные реализации поиска символа Да, лаб. работы": https://wasm.in/threads/studentam-s-voprosami-o-laboratornyx-rabotax-sjuda.7669/
DevilDevil, Эта та ветка, которую вы ищите. А поиск по ней затруднён из за размера. Я не говорил что вы студент.
Пример: Код (ASM): mov eax,0A0Dh movd xmm0,eax mov eax,2 ;размер подстроки в xmm0 mov edi,адрес где искать mov edx,размер области поиска в edi поиск: pcmpestri xmm0,[edi],0Ch ;поиск подстроки из xmm0 с размером eax в [edi] с размером edx, результат в ecx: 0-15 найдено по смещению CF=1, 16-не найдено CF=0 add edi,ecx sub edx,ecx jbe ничего не найдено cmp ecx,17-2 ;2 размер подстроки в xmm0 jnc поиск ;сюда попадаем если найдено - edi=адресу
pcmpestri появился в SSE 4.2 А мне нужно посмотреть SSE2 или даже SSE1 Просто там было много интересных идей, на которых стоит поучиться Indy_, Спасибо Может подскажешь, где эта вся штука начинается? А то ветка и правда очень большая
Для SSE1 не найдёте, а вот для SSE2 например так: Код (ASM): pcmpeqb xmm0,[esi] pmovmskb eax,xmm0 bsf ecx,eax
DevilDevil, > Может подскажешь, где эта вся штука начинается? Я помню что это там всегда обсуждалось, воспользуйтесь гуглом, он найдёт. Но мнение моё иное - не нужно ничего искать, следует открыть доки по архитектуре и изучать. Какие то примеры вам будут абсолютно бесполезны. Почему вы не откроете IA док по этому набору, не понимаю.
Олег, Вот поэтому и хочу найти те посты. Там было множество вариантов решения на разных SSE С замерами производительности. Но пока не нашёл
DevilDevil, а вы в той ветке про SSE отвечали? Ну или фразы какие-то запомнили? Или год когда это обсуждалось?
Из больших тем с разными вариантами и замерами производительности на ум приходит лишь древняя тема Оптимизация подсчёта количества строк в файле. Но это хоть и похожая задача, но не совсем (а для "кого-то" и совсем) не то. Что касается конкретно оптимизации strlen, то больших спец.веток на эту тему я что-то не припомню - все было как-то эпизодически и "между прочим" (например, тут есть битая ссылка на "пример векторизации strlen"). PS: Я так вообще никогда не понимал (и сейчас не понимаю) зачем нужны все эти самопальные (рутинные) навороты с огромными оверхедами на выравнивание, обработку голов\хвостов и т.д., если есть готовые неплохо оптимизированные варианты (в той же ntdll).
Слил всю ветку через HTTrack далее попытался найти упоминание инструкций SSE по шаблонам: movdq, mova, movu, pcmp, pxor, xorp. Ничего нет. linasm использует SSE, исходники открыты, но там задача решается в общем виде и код учитывает все исключительные ситуации. Гугл находит это
DevilDevil, возможно, то что вы ищите было на WASM.RU между 2012 и 2016, поэтому "множество вариантов решения на разных SSE" и нельзя найти