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.)

questionAnswers(4)

yourAnswerToTheQuestion