Comments 10
Насколько я понял, вот баг-репорт.
developercommunity.visualstudio.com/content/problem/734414/it-seems-that-visual-studios-cpp-compiler-creates.html
Буду следить, но не думаю что успеют пофиксить до выхода 16.3 версии, скорее всего пофиксят уже в 16.4.
developercommunity.visualstudio.com/content/problem/734414/it-seems-that-visual-studios-cpp-compiler-creates.html
Буду следить, но не думаю что успеют пофиксить до выхода 16.3 версии, скорее всего пофиксят уже в 16.4.
Судя по документации третий цикл заменяется на: length += res;
Также не совсем понятно зачем первый цикл — можно прочитать без выравнивания с помощью _mm_loadu_si128 и сделать то же, что в основном цикле.
Еще стоит попробовать заменить _mm_cmpistri на _mm_cmpestri — может, станет быстрее.
Также не совсем понятно зачем первый цикл — можно прочитать без выравнивания с помощью _mm_loadu_si128 и сделать то же, что в основном цикле.
Еще стоит попробовать заменить _mm_cmpistri на _mm_cmpestri — может, станет быстрее.
когда loadu попадает на границу страницы, это в лучшем случае медленно, в худшем — segfault.
Интринсики
Компилируются в одну инструкцию
Замена на _mm_cmpestri делает код медленнее, почти в 2 раза.
Выровненная память быстрее на 2-3%, исключения misaligned нет, и да видимо выровнить предварительно лучше, что бы не боятся в основном цикле выхода за границу страницы.
__m128i data = _mm_load_si128((__m128i*)(str + length));
if ((res = _mm_cmpistri(z128, data, _SIDD_CMP_EQUAL_EACH)) != 16)
Компилируются в одну инструкцию
pcmpistri xmm1,xmmword ptr [eax+edx],8
Замена на _mm_cmpestri делает код медленнее, почти в 2 раза.
Выровненная память быстрее на 2-3%, исключения misaligned нет, и да видимо выровнить предварительно лучше, что бы не боятся в основном цикле выхода за границу страницы.
Сделали ли мы самую быструю strlen? – К сожалению, нет, ребята с www.strchr.com/sse2_optimised_strlen сделали еще быстрее и не используя SSE4.2.
А за счет чего, если не секрет? Вроде как по latency/throughput pcmpstri обходит pcmpeqb + pmovmskb + not + bsf для всех актуальных процов. Или они сами итерации грамотнее реализовали?
А пробовали ли вы x64 вместо устаревшего x86?
У меня 17я студия, ваш бенч показывает такое:
x86 debug — 8.5
x86 release (все оптимизации) — 3.1
x64 debug — 6.77
x64 release (все оптимизации) — 1.7
То есть x86 и x64 довольно по-разному себя ведут.
У меня 17я студия, ваш бенч показывает такое:
x86 debug — 8.5
x86 release (все оптимизации) — 3.1
x64 debug — 6.77
x64 release (все оптимизации) — 1.7
То есть x86 и x64 довольно по-разному себя ведут.
Sign up to leave a comment.
Как не сделать самый быстрый strlen и найти недоработку в Visual Studio 2019 Community