¿Por qué GCC o Clang no optimizan el recíproco a 1 instrucción cuando se usa matemática rápida?

 C Programming >> Programación C >  >> Tags >> Clang
¿Por qué GCC o Clang no optimizan el recíproco a 1 instrucción cuando se usa matemática rápida?

Porque la precisión de RCPPS es mucho mucho inferior a float división.

Una opción para habilitar esa optimización no sería apropiada como parte de -ffast-math .

Las opciones de destino x86 del manual de gcc dicen que, de hecho, hay una opción que (con -ffast-math ) hace que gcc los use (con una iteración de Newton-Raphson - rsqrt vectorizado rápido y recíproco con SSE/AVX dependiendo de la precisión / Newton Raphson con SSE2 - alguien puede explicarme estas 3 líneas - SIMD y escalar tienen básicamente el mismo rendimiento por instrucción, y las matemáticas de iteración de Newton son las mismas):

Tenga en cuenta que el nuevo diseño Skylake de Intel mejora aún más el rendimiento de la división FP, con una latencia de 8-11c y un rendimiento de 1/3c. (O uno por rendimiento de 5c para vectores de 256b, pero la misma latencia para vdivps ). Ampliaron las paredes, por lo que AVX vdivps ymm ahora es la misma latencia que para los vectores 128b.

(SnB a Haswell hizo 256b div y sqrt con aproximadamente el doble de latencia/rendimiento de recepción, por lo que claramente solo tenían divisores de 128b de ancho). Skylake también canaliza ambas operaciones más, por lo que aproximadamente 4 operaciones div pueden estar en vuelo. sqrt también es más rápido.

Entonces, en varios años, una vez que Skylake esté muy extendido, solo valdrá la pena hacer rcpps si necesita dividir por lo mismo varias veces. rcpps y un par fma posiblemente podría tener un rendimiento ligeramente mayor pero una latencia peor. Además, vdivps es solo un único uop; por lo que habrá más recursos de ejecución disponibles para que las cosas sucedan al mismo tiempo que la división.

Queda por ver cómo será la implementación inicial de AVX512. Presumiblemente rcpps y un par de FMA para las iteraciones de Newton-Raphson serán una victoria si el rendimiento de la división FP es un cuello de botella. Si el rendimiento de UOP es un cuello de botella y hay mucho trabajo por hacer mientras las divisiones están en vuelo, vdivps zmm probablemente sigue siendo bueno (a menos que el mismo divisor se use repetidamente, por supuesto).

La división de punto flotante frente a la multiplicación de punto flotante tiene más información sobre el rendimiento de FP frente a la latencia.