Aiwan \ (•◡•) / _bot
Я имею в виду, что не стоит смешивать pxor, xorps и xorpd. Хотя это может и не повлиять никак, но припоминается, что иногда может.
xk8.ru/agneroptasm
xk8.ru/agnerinstbl
тоже об этом где то читал. avx надо считать не дополнение к sse, а как его продвинутую замену (эт я про 3х операндные иструкции), при смешивании кода sse и avx происзодит сохранение восстановление (или смена) какогото там контекста, это и замедляет в этом случае работу.
если используешь avx, а эти инструкции вроде как полностью повторяют возможности sse, то их следует использовать везде. по крайней мере надо избегать смешивание хотя бы в своем коде.
так например winapi использует вроде sse и вызовы таких винапишных функций будет нежелателен. верное и обратное, не желателен будет твой код на avx, эт характерно для каких нибудь циклов
Eugene
тоже об этом где то читал. avx надо считать не дополнение к sse, а как его продвинутую замену (эт я про 3х операндные иструкции), при смешивании кода sse и avx происзодит сохранение восстановление (или смена) какогото там контекста, это и замедляет в этом случае работу.
если используешь avx, а эти инструкции вроде как полностью повторяют возможности sse, то их следует использовать везде. по крайней мере надо избегать смешивание хотя бы в своем коде.
так например winapi использует вроде sse и вызовы таких винапишных функций будет нежелателен. верное и обратное, не желателен будет твой код на avx, эт характерно для каких нибудь циклов
Ну современный WinAPI, особенно на Win11 вполне может и AVX/FMA/BMI и пр. использовать. Даже если твой комп не поддерживает что-то, не исключаю, что есть версии библиотек с и без новых инструкций.
Aiwan \ (•◡•) / _bot
Anonymous
Есть, но всё же пишут не зря. Даже если пропатчить это ограничение, можно будет только убедиться в том, что ОС будет работать кривовато
Eugene
TPM отсутствует. Это даже вроде функция материнки, а не процессора.
Андрей
Как сделать так, чтобы маска не обнулялась в vpgatherqq?
Vitaliy ◀️TriΔng3l▶️
Андрей
После операции она нулевой становится
Vitaliy ◀️TriΔng3l▶️
Если тебе нужна маска с единицами, можешь целочисленно сравнить вектор с самим собой
Vitaliy ◀️TriΔng3l▶️
(возможно, заранее обнулив его через xor, что процессор рассматривает как особый случай, чтобы порвать зависимость от предыдущих операций, пишущих в этот регистр, но не знаю, может быть, сравнение регистра с самим собой тоже по-особому рассматривается без зависимости)
Андрей
Vitaliy ◀️TriΔng3l▶️
не понимаю, зачем
Андрей
Ну в теории, может быть они считают что время загрузки через gather гораздо больше чем сравнение
Андрей
Поэтому не критично? Хз не тестил
Vitaliy ◀️TriΔng3l▶️
Masking is optional for most AVX-512 instructions, but gather and scatter instructions are special because they clear bits in the mask as values are loaded or stored, which allows them to resume if they are interrupted before they are done.
чооооо
https://devblogs.microsoft.com/cppblog/microsoft-visual-studio-2017-supports-intel-avx-512/
Vitaliy ◀️TriΔng3l▶️
а, я понял
Vitaliy ◀️TriΔng3l▶️
это если, например, пейдж фолт будет только с частью адресов, чтобы после его обработки заново прогнать инструкцию, и она уже чтобы дозагрузила оставшиеся
Vitaliy ◀️TriΔng3l▶️
вектор обнуляется по лейнам по мере загрузки соответствующих лейнов, а не целиком в конце
Андрей
Да. В псевдокоде это отражено вроде
Андрей
Но интринсик есть без маски
Андрей
Есть ли какие нибудь тулзы, которые оптимизируют asm код?
Anonymous
Если хотите зафиксировать неоптимизированные участки - есть профайлеры типа valgrind, которые анализируют от затраченных тактов, до утечек памяти и провалах в кэше с предсказателем ветвлений.
Но оптимизировать всё равно придётся вам самому. Читать мануалы на нужный процессор и анализировать каждую инструкцию.
Но помимо инструкций, также и важен алгоритм, убедитесь что в алгоритме нельзя сократить количество действий и инструкций, посмотрите на всякие фишки, вроде джамп-таблиц и т.д.
Это дело трудоёмкое, если хотите идеально всё сделать. Если не идеально - достаточно будет просто проанализировать алгоритм, попытаться сократить кол-во действий, этого будет достаточно для общей оптимизации
Андрей
Я имел ввиду, что уже после всех этих действий провести профилактику
Anonymous
Ну профайлером проанализируйте.
Машина лучше не сделает, вы получите аналогичный результат если посидите час над кодом
Eugene
Вот ещё можно поюзать.
Anonymous
xor eax, eax
Как можно сделать системный вызов из c++, чтобы ничего не сломалось на windows?
xor eax, eax
Допустим, что у меня будет задача вызвать Nt* функцию из ntdll без jmp в память этой библиотеки. Пусть у нее будет 5 аргументов
Мой inline asm выглядит примерно так, на функцию будет еще накинут __forceinline для оптимизации
sub rsp, 8 + 8 * 5
...
mov qword ptr [rsp + 0x28], arg5
...
mov eax, syscall_id
syscall
add rsp, 8 + 8 * 5
xor eax, eax
Aiwan \ (•◡•) / _bot
ну тогда если без call/ret, то как и сам сказал выше, используй сисколы, которые от версии к версии ОС меняются (они "версионо" зависимы и на одной версии будут работать, а на другой нет). вот в этом и будет оптимизация (но я не пойму в чем именно, это просто по другому написано, в обход api)
xor eax, eax
Aiwan \ (•◡•) / _bot
если надо чтобы что то быстро работало - напиши это сам, и тогда и сисколы не надо никакие вызывать
Eugene
xor eax, eax
Что мне почитать про ASM syntax в llvm? Я видел, что там есть 3 секции: input, output, неизменяемые регистры. Но каких-то внятных примеров найти не могу
Aiwan \ (•◡•) / _bot
Как ты без сисколов к ядру обратишься?
напишу ядро, работа с которым не требует к нему обращение, типо все сам делаю и ядро мне это все позволяет. эт из разряда "впадаю в крайности", но и вопрос то вроде об оптимизации - на что я и ответил "пиши все сам"
Eugene
xor eax, eax
Eugene
Ищи про асм-вставки в GCC.
xor eax, eax
Они вообще не отличаются?
Eugene
В доках по GCC есть точно.
xor eax, eax
Как-нибудь можно использовать intel syntax вместо at&t без флагов компилятора?
Eugene
.intel_syntax noprefix
Потом только вернуть не забудь:
.att_syntax
Eugene
Ну и переводы строк \n
xor eax, eax
А что насчет выравнивания? Если я откушу себе немного памяти на стеке и верну значение rsp , то ничего же не будет? При условии инлайна тела асм функции
xor eax, eax
*какой-то код от компилятора*
sub rsp, 40
... syscall
add rsp, 40
*какой-то код от компилятора*
Eugene
Eugene
https://www.evilsocket.net/2014/02/11/On-Windows-syscall-mechanism-and-syscall-numbers-extraction-methods/
disba1ancer
disba1ancer
рекомендую функции делающие syscall делать на чистом асме
xor eax, eax
disba1ancer
xor eax, eax
чем?
Такой код проще смотреть в дизассемблере
Eugene
xor eax, eax
Eugene
xor eax, eax
Чтобы этот syscall торчал в теле вызывающей функции
Anonymous
xor eax, eax
Мне нужно сломать жизнь реверсеру в том числе
Eugene
889
Достав необходимое количество байт адреса возврата из стека и сделав джамп
Anonymous
Рет сделает сам компилятор.
Процессор явно не оценит такое.
Они сами заоптимиизированы на типичный код, нормально и вполне рационально использовать call и всё остальное.
Eugene
Eugene
*объявленной/определённой
Anonymous
А вообще, вместо этого можно просто посреди кода, где код явно не будет выполняться, выделить неопределённые байты.
Дизассемблер такое не прожуёт, и сломает несколько байтов последующих инструкций
Anonymous
jmp @f
db 0xf2, 0xEF, 0x99, 0xB1
@@: