C++ 寄存器';使用SSE内部函数的s短缺

C++ 寄存器';使用SSE内部函数的s短缺,c++,memory,sse,cpu-registers,C++,Memory,Sse,Cpu Registers,在这篇文章中,我询问了显式寄存器内存事务和中间指针之间的区别。在实践中,中间指针显示出略高的性能,然而,就硬件而言,不清楚什么是中间指针?若指针被创建,是否意味着一些寄存器也被占用,或者寄存器的调用发生在某些SSE操作期间(例如,_mm_mul) 让我们考虑一下例子: struct sse_simple { sse_simple(unsigned int InputLength): Len(InputLength/4), input1((float*)_m

在这篇文章中,我询问了显式寄存器内存事务和中间指针之间的区别。在实践中,中间指针显示出略高的性能,然而,就硬件而言,不清楚什么是中间指针?若指针被创建,是否意味着一些寄存器也被占用,或者寄存器的调用发生在某些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;
};
struct sse_simple
{
sse_simple(无符号整数输入长度):
Len(输入长度/4),
输入1((浮点数*)_mm_malloc((浮点数*)_mm_malloc(铸造尺寸*浮点数,16)),
输入2((浮点数*)_mm_malloc((浮点数*)_mm_malloc(铸造尺寸*浮点数,16)),
输出((浮点数*)mm_malloc((浮点数*)mm_malloc(16)浮点数),
inp1_sse(重新解释铸造(input1)),
输入1_sse(重新解释铸造(输入2)),
输出(重新解释转换(输出))
{}
~sse_simple()
{
_无毫米(输入1);
_无毫米(输入2);
_无毫米(输出);
}
void func()
{

对于(自动i=0;i首先,寄存器是靠近的小内存(意味着访问速度非常快)对于计算单元。编译器尽可能多地使用它们来加速计算,但如果不能,则使用内存。由于寄存器中存储的内存量很小,通常寄存器在计算过程中仅用作临时变量。大多数情况下,所有内容最终都存储在内存中,临时变量除外例如循环索引…所以寄存器的不足只会降低计算速度

在计算过程中,指针存储在通用寄存器(GPR)中,不管它们指向浮点、向量还是其他什么,而向量
\uuu m128
存储在特定寄存器中

因此,在您的示例中,树数组将存储在内存和行中

output_sse[i] = _mm_mul(inp1_sse[i], inp2_sse[i]);
汇编如下:

movaps -0x30(%rbp),%xmm0    # load inp1_sse[i] in register %xmm0
movaps -0x20(%rbp),%xmm1    # load inp2_sse[i] in register %xmm1
mulps  %xmm1,%xmm0          # perform the multiplication the result is stored in %xmm0
movaps %xmm0,(%rdx)         # store the result in memory
正如您所见,指针是使用寄存器
%rbp
%rdx
存储的