as variáveis SSE / AVX locais estáticas / estáticas estão bloqueando um registro xmm / ymm?
Ao usar intrínsecas SSE, geralmente são necessários zero vetores. Uma maneira de evitar a criação de uma variável zero dentro de uma função sempre que a função é chamada (cada vez que efetivamente chamamos alguma instrução vetorial xor) seria usar uma variável local estática, como em
static inline __m128i negate(__m128i a)
{
static __m128i zero = __mm_setzero_si128();
return _mm_sub_epi16(zero, a);
}
Parece que a variável é inicializada apenas quando a função é chamada pela primeira vez. (Eu verifiquei isso chamando uma função true em vez de _mm_setzero_si128 () intrínseca. Parece ser possível apenas em C ++, não em C, a propósito.)
(1) No entanto, uma vez que essa inicialização ocorreu: Isso bloqueia um registro xmm para o restante do programa?
(2) Pior ainda: se uma variável local estática for usada em várias funções, ela bloquearia vários registros xmm?
(3) Ao contrário: se fornão bloqueando um registro xmm, a variável zero sempre seria recarregada da memória quando a função é chamada? Então a variável local estática seria inútil, pois seria mais rápido usar _mm_setzero_si128 ().
Como alternativa, eu estava pensando em colocar zero em uma variável estática global que seria inicializada no início do programa:
static __m128i zero = _mm_setzero_si128();
(4) A variável global permaneceria em um registro xmm enquanto o programa é executado?
Muito obrigado por sua ajuda!
(Como isso também se aplica aos intrínsecos do AVX, também adicionei a tag AVX.)