定义寄存器的堆栈数组

时间:2013-10-04 22:17:20

标签: c++ templates sse

在性能关键的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寄存器中有持久值,而无需从/向主内存进行读/写。

有什么想法吗?感谢。

1 个答案:

答案 0 :(得分:1)

通常和显而易见的方法是使用预处理器。你可能知道## thing:

#define inc(n) x##n++

inc(1)
inc(2)

另一种可能性是模板和内联函数。 C ++编译器通常非常聪明地尽可能地内联,它们甚至可以放入大型结构的寄存器字段中。他们唯一不喜欢的是那些数组,可能是因为它们的内容可能会被别名指针覆盖。您可能会尝试禁用指针别名,但我怀疑它会有所帮助