在性能关键的C ++函数中,我想使用SSE内在函数来处理某些值。这个函数有一个整数模板参数N
,可以取值1到4,并给出我需要的XMM寄存器的数量。
我可以写这个函数四次,我会解决问题;但是,该功能非常大,我希望通过避免代码重复使其易于维护。我需要的是像
__m128d x[N];
即。我想要N
个不同的__m128d
变量,就像我实例化它们的堆栈数组一样,但上面的代码不起作用,因为它创建了一个双精度数组的堆栈数组并将它“映射”到某个XMM寄存器。
换句话说,我想做一个循环:
for (int i = 0; i < N; ++i) {
k = _mm_add_pd(x[i], k);
}
(这只是一个例子,实际的代码要复杂得多),我正在使用的编译器很好地优化了它,但表达式x[i]
并不是我想要的:生成的代码从内存中读取它,而我希望在XMM寄存器中有持久值,而无需从/向主内存进行读/写。
有什么想法吗?感谢。
答案 0 :(得分:1)
通常和显而易见的方法是使用预处理器。你可能知道## thing:
#define inc(n) x##n++
inc(1)
inc(2)
另一种可能性是模板和内联函数。 C ++编译器通常非常聪明地尽可能地内联,它们甚至可以放入大型结构的寄存器字段中。他们唯一不喜欢的是那些数组,可能是因为它们的内容可能会被别名指针覆盖。您可能会尝试禁用指针别名,但我怀疑它会有所帮助