linux – MOVDQU指令页边界
我有一个简单的测试程序,加载一个xmm寄存器
movdqu指令通过页边界访问数据(OS = Linux). 如果以下页面被映射,这样做很好.如果不是 然而,这减少了非对齐负载的有用性 没关系,除了很多strcmp的实现 还有一个注意事项 – 它出现在GNU C库实现中 无论如何,我的主要问题是 – 在哪里可以找到更多 解决方法
首先,尝试访问未映射地址的任何算法将导致SegFault.如果非AVX代码流使用4字节负载来访问页面的最后一个字节,并且发现没有映射的“下一页”的前3个字节,那么它也会导致SegFault.没有?我相信“问题”是AVX(1/2/3)寄存器比“典型的”要大得多,那些不安全(但是被忽略)的算法被简单地扩展到更大的寄存器.
对齐加载(MOVDQA)永远不会有这个问题,因为它们不会跨越自己的大小或更大的边界.未对齐的负载可以有这个问题(正如你所注意到的)和“经常”.原因是该指令被定义为加载目标寄存器的全部大小.您需要非常仔细地查看指令定义中的操作数类型.您感兴趣的数据量无关紧要,重要的是指令的定义. 然而… AVX1(Sandybridge)添加了一个“movedq”或“movdq”的“masked move”功能,但不会(在架构上)访问未映射的页面,只要掩码未被启用,该访问的那部分将被丢弃在该页面中.这是为了解决这个问题.一般来说,向前移动,加载/存储的蒙版部分(见AVX512)似乎也不会导致对IA的访问冲突. (关于PCMPxSTRx的行为是一个很大的障碍,也许你可以添加15个字节的填充到你的“string”对象?) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |