向 SSE 注册管理
Registers management with SSE
我目前正在处理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 寄存器,但一旦在编译器中启用优化,它应该能够以最小的溢出执行智能寄存器分配。
如果您担心,您可以编译到汇编并自己检查正在使用哪些寄存器,但乍一看,我想不会有任何寄存器。
相关文章:
- 当vector是tje全局变量时,c++中vector的内存管理
- 无法将结构注册为增强几何体3D点
- 如何使用AngelScript注册SFML Vector2运算符
- 如何维护资源管理器项目视图中当前可见的项目列表
- 在遍历处理程序的向量时注册和注销处理程序
- 如何在GTK程序运行时禁用屏幕保护程序/电源管理/屏幕消隐
- 有没有任务栏API可以立即应用注册表更改
- 使用QJsEngine在Qt中注册自定义类型
- 资源管理设计模式
- 使用"Task"函数指针队列定义作业管理器
- 检查注册表项是否链接到(或副本)另一个注册表项
- 如何使用 TStyleManager::UnRegisterStyle() 取消注册样式
- 实现动态插件管理器
- Alt+Enter 在 Win32 应用中,管理大小调整和分辨率
- libcurl 和 DNS ttl 中的内部连接管理
- 如何使用SSE将__m128i注册乘以浮点因子?
- 强制资源管理器重新加载注册表值
- 向 SSE 注册管理
- Internet Explorer BHO,写入注册表和管理权限
- 用管理器注册一个类,然后调用子类被覆盖的方法