作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
根据 MSDN 文档,__faststorefence
比 _mm_sfence
更快。在我的计时中,它慢了三倍以上。
平台:Win7-64、带有 x64 SDK 的 Visual Studio 2010。
#include <windows.h>
#include <xmmintrin.h>
#include <intrin.h>
int main(int argc, char* argv[])
{
int* x = new int;
__int64 loops = 1000000000; // 1 billion
__int64 start, elapsed;
start = __rdtsc();
for (__int64 i = 0; i < loops; i++)
{
*x = 0;
_mm_sfence();
}
elapsed = __rdtsc() - start;
std::cout << "_mm_sfence: " << elapsed << std::endl
<< "average : " << double(elapsed) / double(loops) << std::endl;
start = __rdtsc();
for(__int64 i = 0; i < loops; i++)
{
*x = 0;
__faststorefence();
}
elapsed = __rdtsc() - start;
std::cout << "__faststorefence: " << elapsed << std::endl
<< average : " << double(elapsed) / double(loops) << std::end;
}
结果:
__faststorefence 生成 lock 或 DWORD PTR [rsp], ebp
,其中 ebp 已异或为零,_mm_sfence 生成 sfence
(不出所料)
MSDN docs for __faststorefence明确声明它比 _mm_sfence
快,所以要么我的测试错了,要么他们错了。有什么想法吗?
最佳答案
我使用提供的基准测试测试的 AMD
处理器显示 __faststorefence 是赢家。
Intel - _mm_sfence: 8.61, __faststorefence: 21.60
AMD 1 - _mm_sfence: 138.21, __faststorefence: 90.96
AMD 2 - _mm_sfence: 55.21, __faststorefence: 20.08
这是与 VS 2013 一起使用的。
_mm_sfence = sfence
__faststorefence = lock 或 dword ptr [rsp],esi
关于c++ - _mm_sfence 与 __faststorefence,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12308916/
关于这个问题,我只对 x86 和 x86-64 感兴趣。 对于 MSVC 2005,__faststorefence 的文档说:“保证每个前面的商店在任何后续商店之前都是全局可见的。” 对于 MSVC
根据 MSDN 文档,__faststorefence 比 _mm_sfence 更快。在我的计时中,它慢了三倍以上。 平台:Win7-64、带有 x64 SDK 的 Visual Studio 20
我是一名优秀的程序员,十分优秀!