在這篇文章中SSE load/store memory transactions我問了一下明確的寄存器內存交易和中間指針之間的差異。在實踐中,中間指針表現出略高的性能,但是,在硬件方面什麼是中間指針還不清楚?如果創建了指針,是否意味着某些寄存器也被佔用,或者在某些SSE操作(例如_mm_mul)中發生了寄存器的調用?註冊短缺使用SSE內在
讓我們考慮例如:
struct sse_simple
{
sse_simple(unsigned int InputLength):
Len(InputLength/4),
input1((float*)_mm_malloc((float *)_mm_malloc(cast_sz*sizeof(float), 16))),
input2((float*)_mm_malloc((float *)_mm_malloc(cast_sz*sizeof(float), 16))),
output((float*)_mm_malloc((float *)_mm_malloc(cast_sz*sizeof(float), 16))),
inp1_sse(reinterpret_cast<__m128*>(input1)),
inp1_sse(reinterpret_cast<__m128*>(input2)),
output_sse(reinterpret_cast<__m128*>(output))
{}
~sse_simple()
{
_mm_free(input1);
_mm_free(input2);
_mm_free(output);
}
void func()
{
for(auto i=0; i<Len; ++i)
output_sse[i] = _mm_mul(inp1_sse[i], inp2_sse[i]);
}
float *input1;
float *input2;
float *output;
__m128 *inp1_sse;
__m128 *inp2_sse;
__m128 *output_sse;
unsigned int Len;
};
在上面的例子中間的指針inp1_sse,inp2_sse和output_sse創建一次,在構造函數中。如果我複製大量的sse_simple對象(例如50 000或更多),是否會導致寄存器短缺?