x64 генерирует fcmov / fcomi за минуту

0

У меня есть часть кода, которая находится в плотном цикле, и она выполняет минимальное количество элементов, и это должно быть сделано float с помощью float. Я попытался использовать SSE, но, поскольку он был жестким, загрузка/хранилище фактически делали версию SSE медленнее, чем обычная версия ветвления. Я пытаюсь использовать fcmov, но я не могу заставить VS2010 генерировать это. Это x64, поэтому встроенный asm нельзя использовать. Любые мысли о том, как уговорить vs2010 использовать fcmov/fcomi?

благодаря

  • 0
    Используйте внешний ассемблер
  • 1
    Я не думаю, что вы когда-нибудь сможете убедить 64-битный компилятор использовать FCMOV поскольку эта инструкция использует регистры x87, а не регистры SSE.
Показать ещё 4 комментария
Теги:
floating-point
assembly
visual-studio-2010

1 ответ

0

Это скомпилируется для условного перехода на gcc, не знаю, делает ли VS то же самое.

template<class T>
constexpr inline T min(const T& lhs, const T& rhs) {
   return (lhs<rhs)?lhs:rhs;
}

Использование свойств:
Для процессоров с SSE4_1 Nahelem или новее?
Используйте выровненные нагрузки, поэтому вам может потребоваться добавить исправление цикла в начале и/или в конце.

__m128 O1, O2, O3, mask;
...
mask = _mm_cmplt_ps(O2, O3); // O2 < O3
O1 = _mm_blendv_ps(O2, O3 ,mask); // O1 = (O2<O3)?O2:O3
  • 0
    да, я использую почти то же самое, используя тернарный оператор, но в VS2010 он компилируется в инструкции с jb / jl (прыжками) в них.
  • 0
    В GCC компилятор обнаруживает некоторые собственные преобразования в SIMD, если уровень оптимизации установлен достаточно высоко, может быть, VC тоже такой умный?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню