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