相关疑难解决方法(0)

是静态/静态本地SSE/AVX变量阻塞xmm/ymm寄存器?

使用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标记.)

c++ sse avx

6
推荐指数
2
解决办法
1048
查看次数

在x86上独占访问L1缓存行?

如果一个64字节的缓冲区被大量读/写,那么它很可能会被保存在L1中; 但有没有办法强迫这种行为?

同样,给一个核心独占访问这64个字节,并告诉它不要将数据与其他核心和内存控制器同步,这样这些64个字节总是存在于一个核心的L1中,无论CPU是否认为它经常被使用.

performance x86 assembly low-level cpu-cache

4
推荐指数
1
解决办法
178
查看次数

标签 统计

assembly ×1

avx ×1

c++ ×1

cpu-cache ×1

low-level ×1

performance ×1

sse ×1

x86 ×1