在这篇SSE 加载/存储内存事务中,我询问了显式寄存器内存事务和中间指针之间的区别。在实践中,中间指针表现出稍高的性能,但是,从硬件角度来说,中间指针是什么还不清楚?如果创建了指针,是否意味着某些寄存器也被占用,或者在某些 SSE 操作期间发生了寄存器的调用(例如_mm_mul)?
让我们考虑这个例子:
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 或更多),这会导致寄存器短缺吗?