Вот как вы думаете, современные процессоры, встретив в коде условный переход типа if () {} else {}, какую ветвь кода выполняют?
Правильный ответ: обе.
Почему? Потому что оперативная память, раздери её Вулкан, до сих пор является самой тормозной частью компьютера. Компьютер может выполнять инструкции гораздо быстрее, чем подтаскивать данные из
(
Read more... )
Меня учили в 2010 году, что обе. Поменялось это, насколько я понимаю, с появлением архитектур IA64 и AMD64 и когда процессоры стали отращивать себе вооооот-такенные конвееры. И prediction поменялось на predication, не знаю, как по-русски. Результаты одной ветви разрешают менять системное состояние, а другую посылают нафиг.
> ведь для выполнения обеих ветвей одновременно нам нужно по сути дублировать ядро, или хотя бы реализовать что-то типа гипертрединга на уровне двух условных ветвей исполнения
Так векторные инструкции же, сиречь SIMD. Операции над разными данными могут выполняться одновременно.
> "Как минимум". Потому что кроме выборки команд из памяти (тем более они один фиг 90% уже есть в кеше) есть нюанс их предварительного декодирования и запихивания с правильными интервалами в конвейер, и на это тоже требуется время.
Вот тут 100% согласен.
Reply
Непонятно только, при чём тут SIMD: во первых, в разных ветках скорее всего будут разные инструкции (с чего бы им быть одинаковыми), а это уже не single, а во вторых, SIMD же вроде подмножество (расширение набора) инструкций, вполне вероятно что исполняться будут инструкции не из этого подмножества.
Reply
Но если код типа
if (трусы == красные)
{
красныеТрусы++;
}
else
{
прочиеТрусы++;
}
То я думаю, что компилятор вполне может записать это в машкодах векторными инструкциями - операция-то одна и та же.
> Всё это на одном ядре, то есть действительно что-то типа гипертрединга
Может быть оно типа конвеер заполняет в шахматном порядке :) Точно не знаю, надо уже инженеров Интела спрашивать, для меня это уже слишком сильное шаманство.
Reply
С SIMD всё-таки не могу согласиться. Во первых, вероятность подобного кода - чтобы хотя бы пара первых команд после ветвления буквально, до машкодов, совпадала - по моему достаточно низка, чтобы на это не было смысла заморачиваться. Во вторых, если возложить "склеивание" команд после ветвления на процессор, это ещё дополнительно усложнит процессор, если же возложить это на компилятор - придётся вводить в машкоды очередные дополнительные флажки вида "это не одна команда, это две из разных веток" (ну или "эти команды можно склеить"), что тоже в общем не фонтан. А в третьих, SIMD - это всё-таки инструкции для специфической массовой обработки данных, у них обязан быть некий оверхед по сравнению с элементарными операциями за счёт более сложного задания операции и операндов, который оправдан тем, что дальше быстро обрабатывается весь массив. Если же мы заменим две разных команды инкремента одним SIMD, но один из результатов потом выкинем, мы получим оверхед от SIMD, но не получим никакого выигрыша от массовости, даже простое последовательное выполнение элементарных команд может оказаться быстрее.
Так что скорее всего какие-то извраты вроде дополнительных параллельных конвейеров, или "в шахматном порядке" (конвейер один, но к каждой операции приклеен тэг, или как они его называют "предикат", определяющий то, к какой ветви относится команда)...
Reply
Reply
Leave a comment