она будет использоваться на более старом, как мне решить что использовать во время работы без потери производительности?
Перекомпилировать не особо хороший вариант.
Есть проверки на версию микроархитектуры
мдэ а в чом проблема юзать cpuid и читать флаги, а потом уже переключаться между сетом инструкций внутри программы. Я вообще отказался от процедур в большинстве случаев и пишу макросами, написал нужную мне математику на SSE отдельно от AVX и отдельно вообще только FPU
Я это знаю, но у меня проблема в том, что я тупой. Можно же не каждый раз, когда ты операцию исполняешь проверку выполнять, но я не знаю как.
Делается несколько версий процедуры. Перед вызовом проверяется какой именно процессор. Можно в начале программы записать указатель на процедуру и тягать по указателю
if 386 then .... if 14900k then .... итого ты пишешь несколько версий кода для разных версий проца в одной программе
указатель звучит лучше, хотя может и нет.
Ну сделай что-нибудь типа: func: jmp [func_impl] func_detect: <detect> jz .slow .fast: mov [func_impl],func_fast jmp func .slow mov [func_impl],func_slow jmp func func_impl dd func_detect Можно ещё быстрее, если положить func_fast сразу после джампа в func и забивать джамп нопами в случае чего.
Также можно записывать новый код для процедур на лету. Ещё немного, и получится подобие JIT.
тоесть, этот новый код уже должен в программе иметься на момент старта программы в виде каких либо данных? а не лучше тогда сразу их в секцию кода загнать при сборке?
Интересно только, как этт сделать.
Можно и так. Но тогда надо патчить вызов процедуры, инструкцию call <адрес>.
не надо. cpuid решит проблему по какой ветке пойдет выполняться код, имхо
Да, но разве сначала пропатчить нужный код, а потом его не трогать во время выполнения не получится быстрее и удобнее, чем хранить адрес нужной процедуры и каждый раз бранчить?
чел выше сказал что "Перекомпилировать не особо хороший вариант." значит у него есть исходник. если есть исходник, тот зачем весь этот гемор с патчем, когда можно все написать 1 раз и навсегда?
Это просто операционка.
Это вообще наилучший вариант. Вот только там есть проблема с хвостовыми вызовами, их не отследить нормально.
Стикер
Есть программа
Извините
Я кринжую с того что упомянаю операционку
меня за 20 минут уже 2 или 3 ввели в заблуждение
Каждый раз иметь ветвление или читать адрес из постороннего участка памяти по идее должно быть медленнее.
если уж совсем в крайности податься, то это "каждый раз" может случиться лишь 1 раз. это много?
Нет, ну если ещё честнее, то это модульная "идея", которая будет компилироваться как операционка и как программа, в основном там не будет асаемблер, но он нужен для функции которым необходима скорость.
хм, так у меня что, был варик отвечать не честно. а че так можно было???
Вот человек пишет, что это для критичных к скорости участков кода. Если в скорости нет смысла, то можно и не париться с различными версиями кода. А ускорять можно например по моему предложению.
Там вся программа критична к скорости, просто имет смысл писать большую часть кода на С с -O3.
Обсуждают сегодня