3

MSDN のドキュメントによると、__faststorefenceは より高速です_mm_sfence。私のタイミングでは、3倍以上遅くなります。

プラットフォーム: 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;
}

結果:

  • _mm_sfence 平均: 5.7
  • __faststorefence 平均: 18.37

__faststorefence はlock or DWORD PTR [rsp], ebp、ebp がゼロに xor された を生成し、_mm_sfence はsfence(当然のことながら)を生成します。

__faststorefenceのMSDN ドキュメントには、それよりも高速であると明示的に記載されている_mm_sfenceため、私のテストが間違っているか、間違っているかのどちらかです。何か案は?

4

2 に答える 2