Я работаю над некоторым кодом, который предназначен для работы на x86 в 32-битном режиме. В этом режиме я понимаю, что у меня есть только 8 SIMD/AVX2-регистров (YMM0-7), с которыми можно свободно работать. Тем не менее, некоторые из моих векторных подпрограмм в одиночку иногда используют больше, чем это количество регистров одновременно (что означает, что они все еще нужны где-то в дороге - в основном не так уж и поздно).Какое влияние влияет на экспорт регистров на стек?
Я понимаю, что компиляторы будут экспортировать старые регистры в стек памяти, когда они не могут найти неиспользуемые регистры. Но насколько это влияет на производительность? (например, в цикле на экспорт/импорт позже). Могу ли я доверять стеке, в основном, находящемуся в L1-D-Cache (с задержкой в 2 цикла в Haswell) или есть существенное влияние на производительность, позволяющее избежать таких передач с регистром-памятью (и наоборот)?
До сих пор я не мог найти ответы на эту тему, тем более, что регистры продолжают становиться все больше и больше (1 Cacheline за регистрацию на предстоящей платформе Skylake). Было бы неплохо, если бы вы могли дать источники, если вы ответите.
Ваш код будет медленнее, конечно. Если вы хотите узнать, насколько просто прокомментируйте свой код, сравнивая 32-битную и 64-битную версии. Только ты можешь это сделать. –
Из любопытства. Почему вы ограничены 32-битным режимом? Core2 вышел почти девять лет назад. А так как Nehalem (2008) macro op fusion работает в 64-битном режиме. AVX512, который выйдет в следующем году, будет иметь 32 AVX512 регистра в 64-битном режиме и только 8 в 32-битном режиме. Почему вы ограничиваете свой код только 32-битным режимом? –
Я согласен с вами обоими. Похоже, мне нужно сравнить его, чтобы проверить, лучше ли корректировать мои инстрики. Требуется 32-разрядная поддержка, поскольку некоторые рабочие станции все еще работают с 32-разрядной операционной системой. Вопрос будет таким же, будь то его 8 или 16 регистров, только менее суровый. –