c++ - 上交所注册管理

标签 c++ memory-management sse cpu-registers

我目前正在与 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 寄存器,但一旦您在编译器中启用优化,它应该能够以最小的溢出执行智能寄存器分配。

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

关于c++ - 上交所注册管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29773199/

相关文章:

c++ - 多线程和boost的io_service

c++ - 优化矩阵旋转 - 关于矩阵中心的任意角度

objective-c - 窗口关闭时从 NSMutableArray 中移除 NSWindowController

cocoa-touch - iOS 应用程序启动时占用近 40mb

c - 使用 SSE 缩放复杂 vector

x86 - 使用Intel AVX从压缩 double 向量存储单个 double

linux - x86 上的堆栈对齐

c++ - 使用 C++ 复制而不是 memcpy 的段错误

如果像 C# 一样没有传递任何内容,C++ 将函数参数设置为 null

memory-management - 使用道场后如何清理?