使用SSE内在函数时,通常需要零向量.无论何时调用函数(每次有效调用某些xor向量指令),避免在函数内部创建零变量的一种方法是使用静态局部变量,如
static inline __m128i negate(__m128i a)
{
static __m128i zero = __mm_setzero_si128();
return _mm_sub_epi16(zero, a);
}
Run Code Online (Sandbox Code Playgroud)
似乎只在第一次调用函数时才初始化变量.(我通过调用一个真正的函数而不是_mm_setzero_si128()内在函数来检查这个.顺便说一句,它似乎只能在C++中,而不是在C中.)
(1)但是,一旦发生这种初始化:这是否阻止了xmm寄存器用于程序的其余部分?
(2)更糟糕的是:如果在多个函数中使用这样的静态局部变量,它会阻塞多个xmm寄存器吗?
(3)反过来说:如果它没有阻塞xmm寄存器,那么在调用函数时,零变量是否总是从内存中重新加载?那么静态局部变量将毫无意义,因为使用_mm_setzero_si128()会更快.
作为替代方案,我考虑将零置于一个全局静态变量中,该变量将在程序启动时初始化:
static __m128i zero = _mm_setzero_si128();
Run Code Online (Sandbox Code Playgroud)
(4)程序运行时,全局变量是否会保留在xmm寄存器中?
非常感谢你的帮助!
(由于这也适用于AVX内在函数,我还添加了AVX标记.)
如果一个64字节的缓冲区被大量读/写,那么它很可能会被保存在L1中; 但有没有办法强迫这种行为?
同样,给一个核心独占访问这64个字节,并告诉它不要将数据与其他核心和内存控制器同步,这样这些64个字节总是存在于一个核心的L1中,无论CPU是否认为它经常被使用.