向 SSE 注册管理

Registers management with SSE

本文关键字:注册管理 SSE      更新时间:2023-10-16

我目前正在处理SSE进行代码优化。

这是代码的一小部分(无论这里做什么):

            __m128 r_x, r_y, r_width, r_height, width;
            data[0] = (double*)computer->imageIntegralChannels[current0->r_channel].data;
            data[1] = (double*)computer->imageIntegralChannels[current1->r_channel].data;
            data[2] = (double*)computer->imageIntegralChannels[current2->r_channel].data;
            data[3] = (double*)computer->imageIntegralChannels[current3->r_channel].data;
            r_x = _mm_setr_ps(current0->r_x, current1->r_x, current2->r_x, current3->r_x);
            r_y = _mm_setr_ps(current0->r_y, current1->r_y, current2->r_y, current3->r_y);
            r_width = _mm_setr_ps(current0->r_width, current1->r_width, current2->r_width, current3->r_width);
            r_height = _mm_setr_ps(current0->r_height, current1->r_height, current2->r_height, current3->r_height);
            width = _mm_setr_ps(computer->imageIntegralChannels[current0->r_channel].cols, computer->imageIntegralChannels[current1->r_channel].cols, computer->imageIntegralChannels[current2->r_channel].cols, computer->imageIntegralChannels[current3->r_channel].cols);
            __m128 w_x_p = _mm_setr_ps(window_x_pos, window_x_pos + padding , window_x_pos + padding + padding, window_x_pos + padding + padding + padding);
            __m128 w_y_p = _mm_set_ps1(window_y_pos);
            __m128 m1, m2, m3, m4, m5, m6, m7, m8, m9, m10;
            // First data parameter
            m1 = _mm_add_ps(r_x, w_x_p);
            m2 = _mm_add_ps(r_y, w_y_p);
            m3 = _mm_mul_ps(m2, width);
            m4 = _mm_add_ps(m3, m1);
            // Second data parameter
            m5 = _mm_add_ps(m1, r_width);
            m6 = _mm_add_ps(m2, r_height);
            m7 = _mm_mul_ps(m6, width);
            m8 = _mm_add_ps(m5, m7);
            // Third data parameter
            m9 = _mm_add_ps(m5, m3);
            // Fourth data parameter
            m10 = _mm_add_ps(m1, m7);
            _mm_store_ps(data_p1, m4);
            _mm_store_ps(data_p2, m8);
            _mm_store_ps(data_p3, m9);
            _mm_store_ps(data_p4, m10);

我知道 SSE 实现了 16 个寄存器,每个寄存器为 128 位(仅使用 x64 架构)。在我的代码中,我同时使用超过 16 个寄存器(实际上是 17 个)。

我是否浪费时间同时使用超过16个寄存器?记忆中发生了什么?我是否应该始终尝试管理少于 16 个__m128寄存器的 SSE 代码?

提前谢谢你!保罗

这不会有问题。尽管__m128数据类型映射到 SSE 寄存器,但一旦在编译器中启用优化,它应该能够以最小的溢出执行智能寄存器分配。

如果您担心,您可以编译到汇编并自己检查正在使用哪些寄存器,但乍一看,我想不会有任何寄存器。