_mm_sfence vs __faststorefence

Согласно документации MSDN, __faststorefence быстрее чем _mm_sfence, В мои сроки это более чем в три раза медленнее.

Платформа: Win7-64, Visual Studio 2010 с x64 SDK.

#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’ed к нулю, и _mm_sfence генерирует sfence (Неудивительно)

Документы MSDN для __faststorefence прямо заявляет, что это быстрее, чем _mm_sfence так что либо мой тест неверен, либо нет. Есть идеи?

3

Решение

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 = замок или меч ptr [rsp], esi

1

Другие решения

Вы не можете сравнивать __fasstorefence (полный забор) с _mm_sfence (магазинный забор).

Вам нужно сравнить __fasstorefence (полный забор) с _mm_mfence (m — полный забор).

0

По вопросам рекламы [email protected]