Я использую rdtsc для измерения в тактах, а вот cpuid я использовал буквально один раз в незаконченном коде как селектор выбора оптимального кода для текущей машины.
Есть обновление, тесты AndreyDmitriev показали, что лучший на данный момент код на AVX-512 в 10 раз быстрей. Возможно мой код можно ускорить в два и даже три раза, но все равно AVX-512 будет в три пять раз быстрей.
В примере с Если процессор поддерживает SHA256RNDS2, SHA256MSG1 и SHA256MSG2, есть момент который я хотел попробовать, а именно непосредственную загрузку коэффициентов в регистры не из памяти, а непосредственно командным способом.
Ну и если задуматься то весь этот код по сути ассемблерный, но обернутый в С-подобный синтаксис, что позволяет значительно легче интегрировать его в целевой проект.
Возможно еще один способ который позволяет их коду быть быстрей, это какой то хитрый способ заставить проц грузить данные в кеш заблаговременно.
Вы совершенно правы, я забыл перезапустить указатель на таблицу констант между блоками, в итоге начиная со второго блока вместо констант происходило чтение мусора.
Что еще раз напоминает об опасности работы с указателями.
Большое Вам спасибо за внимание к моему коду и его проверку.
Забавно, но вот только что я узнал ответ на этот вопрос.
Изначально инструкция movd появилась вместе с ММХ до х64 и могла пересылать только 32-битные данные из GPR в MMX, а инструкция movq пересылала данные между регистрами MMX, потом регистры расширили, а мнемонику менять не стали, и по прежнему movd пересылает данные между разными регистрами, а movq между регистрами ММХ.
Я компилирую через ml64 у него есть странный баг, он не понимает инструкцию movq в данном контексте, мне даже попадалась инфа в нете, что люди обращались по этому вопросу и им ответили что и так сойдет.
У меня нет оснований для такого утверждения, но я предполагаю что регистры MMX & XMM с аппаратной точки зрения это одни и те же регистры, где в качестве MMX регистра выступает нижняя часть MMX регистра, таким образом мой код просто "отжимает" себе больше регистров из общей "кучи". К примеру в Skylake 128 векторных регистров, разделяемых между 6-8 ядрами.
Согласен что решение через старшие регистры SIMD "безопасней".
К моему удивлению, практически никакой разницы, увеличение размеров регистров позволит упростить перемещение между ними и разместить все вычисление в SIMD, но алгоритмы Декомпрессии и Компрессии по прежнему будут вычисляться по два и одно значение за раз.
AVX & AVX-512 сделают код короче и быстрей, но не в разы.
Есть тысяча тонн рения на НОО в форме шара объемом примерно 45 кубометров и диаметром 4,5 метра. Сталкиваем его с орбиты и он падает в океан на мелководье где мы его поднимаем. (Первый простой вариант)
Есть тысяча тонн рения и примерно две тысячи тонн лития на НОО в форме шара где рений снаружи а литий внутри, объемом примерно 3790 кубометров и диаметром 19,3 метра. Сталкиваем его с орбиты и он падает в глубоководную часть океана после чего всплывает самостоятельно за счет положительной плавучести, цепляем на трос тащим в порт.
А зачем считать чужие деньги? а зачем вообще "считать", давайте искренне верить людям которые гораздо лучше нас разбираются в ситуации и в расчетах. Я слышал таких очень много на телевизионных каналах финансируемых за госсчет, как вам такая идея?
Я использую
rdtsc
для измерения в тактах, а вотcpuid
я использовал буквально один раз в незаконченном коде как селектор выбора оптимального кода для текущей машины.Есть обновление, тесты AndreyDmitriev показали, что лучший на данный момент код на AVX-512 в 10 раз быстрей. Возможно мой код можно ускорить в два и даже три раза, но все равно AVX-512 будет в три пять раз быстрей.
В примере с Если процессор поддерживает SHA256RNDS2, SHA256MSG1 и SHA256MSG2, есть момент который я хотел попробовать, а именно непосредственную загрузку коэффициентов в регистры не из памяти, а непосредственно командным способом.
Ну и если задуматься то весь этот код по сути ассемблерный, но обернутый в С-подобный синтаксис, что позволяет значительно легче интегрировать его в целевой проект.
Возможно еще один способ который позволяет их коду быть быстрей, это какой то хитрый способ заставить проц грузить данные в кеш заблаговременно.
Надо попробовать убрать MMX и перенести все в SIMD
На wiki написано, что часть OpenSSL написан на ассемблере, так что возможно тут соревнуются два асм кода и похоже их лучше.
Исправил.
В процедуре загрузки я не учел, что "заглушку" тоже нужно перевернуть.
Попробуйте сейчас.
Вы совершенно правы, я забыл перезапустить указатель на таблицу констант между блоками, в итоге начиная со второго блока вместо констант происходило чтение мусора.
Что еще раз напоминает об опасности работы с указателями.
Большое Вам спасибо за внимание к моему коду и его проверку.
Надеюсь он Вам пригодится.
Забавно, но вот только что я узнал ответ на этот вопрос.
Изначально инструкция movd появилась вместе с ММХ до х64 и могла пересылать только 32-битные данные из GPR в MMX, а инструкция movq пересылала данные между регистрами MMX, потом регистры расширили, а мнемонику менять не стали, и по прежнему movd пересылает данные между разными регистрами, а movq между регистрами ММХ.
Я компилирую через ml64 у него есть странный баг, он не понимает инструкцию movq в данном контексте, мне даже попадалась инфа в нете, что люди обращались по этому вопросу и им ответили что и так сойдет.
Так и живем.
Попробую, проверю.
Если не выходить за пределы SSE то пенальти не будет назначено.
Поправил
У меня нет оснований для такого утверждения, но я предполагаю что регистры MMX & XMM с аппаратной точки зрения это одни и те же регистры, где в качестве MMX регистра выступает нижняя часть MMX регистра, таким образом мой код просто "отжимает" себе больше регистров из общей "кучи". К примеру в Skylake 128 векторных регистров, разделяемых между 6-8 ядрами.
Согласен что решение через старшие регистры SIMD "безопасней".
К моему удивлению, практически никакой разницы, увеличение размеров регистров позволит упростить перемещение между ними и разместить все вычисление в SIMD, но алгоритмы Декомпрессии и Компрессии по прежнему будут вычисляться по два и одно значение за раз.
AVX & AVX-512 сделают код короче и быстрей, но не в разы.
Есть тысяча тонн рения на НОО в форме шара объемом примерно 45 кубометров и диаметром 4,5 метра. Сталкиваем его с орбиты и он падает в океан на мелководье где мы его поднимаем. (Первый простой вариант)
Есть тысяча тонн рения и примерно две тысячи тонн лития на НОО в форме шара где рений снаружи а литий внутри, объемом примерно 3790 кубометров и диаметром 19,3 метра. Сталкиваем его с орбиты и он падает в глубоководную часть океана после чего всплывает самостоятельно за счет положительной плавучести, цепляем на трос тащим в порт.
"Все" посты одна сплошная ошибка выжившего, все пишут о тех кого наняли, я вот хотел бы почитать о тех кого не наняли.
Я с удовольствием почитал бы книгу "Токсичное программирование", жаль таких не пишут.
Напишите лучше.
А зачем считать чужие деньги? а зачем вообще "считать", давайте искренне верить людям которые гораздо лучше нас разбираются в ситуации и в расчетах. Я слышал таких очень много на телевизионных каналах финансируемых за госсчет, как вам такая идея?
Топтание на месте и даже в чем-то движение назад.
MASM лже пророк, только в ARM наше спасение.