Eugene
Спасает vpxor
Ну vpxor точно не стоит мешать с pxor.
Aiwan \ (•◡•) / _bot
Я имею в виду, что не стоит смешивать pxor, xorps и xorpd. Хотя это может и не повлиять никак, но припоминается, что иногда может. xk8.ru/agneroptasm xk8.ru/agnerinstbl
тоже об этом где то читал. avx надо считать не дополнение к sse, а как его продвинутую замену (эт я про 3х операндные иструкции), при смешивании кода sse и avx происзодит сохранение восстановление (или смена) какогото там контекста, это и замедляет в этом случае работу. если используешь avx, а эти инструкции вроде как полностью повторяют возможности sse, то их следует использовать везде. по крайней мере надо избегать смешивание хотя бы в своем коде. так например winapi использует вроде sse и вызовы таких винапишных функций будет нежелателен. верное и обратное, не желателен будет твой код на avx, эт характерно для каких нибудь циклов
Eugene
тестил вин11? какова она для тебя?
Нет, не тестил. Мой проц не поддерживается. Хотя, может, и есть обходные пути.
Anonymous
Есть, но всё же пишут не зря. Даже если пропатчить это ограничение, можно будет только убедиться в том, что ОС будет работать кривовато
Eugene
TPM отсутствует. Это даже вроде функция материнки, а не процессора.
Андрей
Как сделать так, чтобы маска не обнулялась в vpgatherqq?
Vitaliy ◀️TriΔng3l▶️
Как сделать так, чтобы маска не обнулялась в vpgatherqq?
Она же на вход передаётся, как она может обнуляться?
Андрей
После операции она нулевой становится
Vitaliy ◀️TriΔng3l▶️
Если тебе нужна маска с единицами, можешь целочисленно сравнить вектор с самим собой
Vitaliy ◀️TriΔng3l▶️
(возможно, заранее обнулив его через xor, что процессор рассматривает как особый случай, чтобы порвать зависимость от предыдущих операций, пишущих в этот регистр, но не знаю, может быть, сравнение регистра с самим собой тоже по-особому рассматривается без зависимости)
Андрей
Если тебе нужна маска с единицами, можешь целочисленно сравнить вектор с самим собой
Да. Но приходится перед каждым gather вызывать это сравнение
Vitaliy ◀️TriΔng3l▶️
После операции она нулевой становится
А, вижу, ну, сохранить в другом векторе. Или заново создавать через сравнение, смотри по производительности
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
Есть ли какие нибудь тулзы, которые оптимизируют asm код?
Ассемблер код в праве трогать только программист на ассемблере, иначе нет смысла вообще на нём программировать, возьмите компилятор ЯВУ
Андрей
Ассемблер код в праве трогать только программист на ассемблере, иначе нет смысла вообще на нём программировать, возьмите компилятор ЯВУ
Так и знал, что кто-то так ответит. Ну почему? Человек не всегда идеально может написать, а машина может найдет где улучшить при сохранении так называемого наблюдаемого поведения. Какие нибудь проценты, но все же
Anonymous
Если хотите зафиксировать неоптимизированные участки - есть профайлеры типа valgrind, которые анализируют от затраченных тактов, до утечек памяти и провалах в кэше с предсказателем ветвлений. Но оптимизировать всё равно придётся вам самому. Читать мануалы на нужный процессор и анализировать каждую инструкцию. Но помимо инструкций, также и важен алгоритм, убедитесь что в алгоритме нельзя сократить количество действий и инструкций, посмотрите на всякие фишки, вроде джамп-таблиц и т.д. Это дело трудоёмкое, если хотите идеально всё сделать. Если не идеально - достаточно будет просто проанализировать алгоритм, попытаться сократить кол-во действий, этого будет достаточно для общей оптимизации
Андрей
Я имел ввиду, что уже после всех этих действий провести профилактику
Anonymous
Ну профайлером проанализируйте. Машина лучше не сделает, вы получите аналогичный результат если посидите час над кодом
Eugene
Вот ещё можно поюзать.
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
Aiwan \ (•◡•) / _bot
Допустим, что у меня будет задача вызвать 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
а что значит вызов процедуры без джампа в память библиотеки? разве вызов процедуры/сискола это не есть джамп куда либо? вызов чего либо это вроде и значит что это должно отработать, тоесть r/e(ip)изменится на некую другую память. а ты спрашиваешь как что то сделать но чтоб eip не изменился. чет у мя в голове какое то противоречие возникает. поясни эту ситуацию
Aiwan \ (•◡•) / _bot
ну тогда если без call/ret, то как и сам сказал выше, используй сисколы, которые от версии к версии ОС меняются (они "версионо" зависимы и на одной версии будут работать, а на другой нет). вот в этом и будет оптимизация (но я не пойму в чем именно, это просто по другому написано, в обход api)
Aiwan \ (•◡•) / _bot
если надо чтобы что то быстро работало - напиши это сам, и тогда и сисколы не надо никакие вызывать
xor eax, eax
Что мне почитать про ASM syntax в llvm? Я видел, что там есть 3 секции: input, output, неизменяемые регистры. Но каких-то внятных примеров найти не могу
Aiwan \ (•◡•) / _bot
Как ты без сисколов к ядру обратишься?
напишу ядро, работа с которым не требует к нему обращение, типо все сам делаю и ядро мне это все позволяет. эт из разряда "впадаю в крайности", но и вопрос то вроде об оптимизации - на что я и ответил "пиши все сам"
Eugene
Ищи про асм-вставки в GCC.
xor eax, eax
Они вообще не отличаются?
Eugene
В доках по GCC есть точно.
Eugene
Они вообще не отличаются?
Нет. Можно, есть какие-то нюансы, но я про них не знаю. Должно быть по идее 100% идентично.
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
https://www.evilsocket.net/2014/02/11/On-Windows-syscall-mechanism-and-syscall-numbers-extraction-methods/
disba1ancer
рекомендую функции делающие syscall делать на чистом асме
disba1ancer
*какой-то код от компилятора* sub rsp, 40 ... syscall add rsp, 40 *какой-то код от компилятора*
и второй нюанс, если вставляемый тобой код вызывает внешние функции напасанные на си или плюсах, лучше выравнивай как положено
xor eax, eax
xor eax, eax
чем?
Такой код проще смотреть в дизассемблере
Eugene
с rsp могут быть проблемы из-за ред зоны в abi
Ред зона в линуксе, и она под стеком, а не над.
disba1ancer
Ред зона в линуксе, и она под стеком, а не над.
вот именно если в середине функции вставлять подобный код, можно её сломать
Eugene
Тогда мне надо делать ret, а это плохо
Рет сделает сам компилятор.
xor eax, eax
Рет сделает сам компилятор.
А мне нужно убрать рет
xor eax, eax
Чтобы этот syscall торчал в теле вызывающей функции
Eugene
Чтобы этот syscall торчал в теле вызывающей функции
Ну ты сделай в функции и обзови ее always inline или forced inline, как ее там?
Eugene
А мне нужно убрать рет
Зачем? Типа лишние такты? :)
Anonymous
Я имею ввиду полное отсутствие call/ret и включение всевозможных оптимизаций
Не понял. Вы написали, что это оптимизация, или я не так понял?
xor eax, eax
Зачем? Типа лишние такты? :)
> Такой код проще смотреть в дизассемблере
xor eax, eax
Мне нужно сломать жизнь реверсеру в том числе
Anonymous
Мне нужно сломать жизнь реверсеру в том числе
Обычно в итоге программисты ломают жизнь себе, пытаясь создать кашу вручную, а потом понимая, что сами же в ней заблудились
889
Мне нужно сломать жизнь реверсеру в том числе
А что мешает самому прописать инструкцию рет, зная тип вызова?
889
Достав необходимое количество байт адреса возврата из стека и сделав джамп
Anonymous
Рет сделает сам компилятор.
Процессор явно не оценит такое. Они сами заоптимиизированы на типичный код, нормально и вполне рационально использовать call и всё остальное.
Eugene
Процессор явно не оценит такое. Они сами заоптимиизированы на типичный код, нормально и вполне рационально использовать call и всё остальное.
Я не сразу сообразил что имеется в виду под функцией полностью на асме :) Я подумал про инлайн асм в отдельно оформленной функции :)
Eugene
*объявленной/определённой
Anonymous
А вообще, вместо этого можно просто посреди кода, где код явно не будет выполняться, выделить неопределённые байты. Дизассемблер такое не прожуёт, и сломает несколько байтов последующих инструкций
Anonymous
jmp @f db 0xf2, 0xEF, 0x99, 0xB1 @@: