Como extensión de la respuesta de Moyner , el chip sqrt
suele ser una rsqrt
raíz cuadrada recíproca que calcula . Entonces, si en su código solo va a usar1/r(si está haciendo dinámica molecular, sí), puede calculardirectamente y ahorrarse la división. La razón por la cualse calcula en lugar dees que su iteración de Newton no tiene divisiones, solo adiciones y multiplicaciones.a→1/a−−√1/rr = rsqrt(r2)
rsqrt
sqrt
Como nota al margen, las divisiones también se calculan de forma iterativa y son casi tan lentas como rsqrt
en el hardware. Si busca eficiencia, es mejor que intente eliminar divisiones superfluas.
Algunas arquitecturas más modernas, como las arquitecturas POWER de IBM, no proporcionan rsqrt
per se, sino una estimación precisa de unos pocos bits, por ejemplo, FRSQRTE . Cuando un usuario llama rsqrt
, esto genera una estimación y luego una o dos (tantas como sea necesario) iteraciones del algoritmo de Newton o Goldschmidt usando multiplicaciones y sumas regulares. La ventaja de este enfoque es que los pasos de iteración se pueden canalizar e intercalar con otras instrucciones sin bloquear la FPU (para obtener una visión general muy buena de este concepto, aunque en arquitecturas antiguas, consulte la Tesis doctoral de Rolf Strebel ).
Para potenciales de interacción, la sqrt
operación se puede evitar por completo utilizando un interpolante polinómico de la función potencial, pero mi propio trabajo (implementado en mdcore
) en esta área muestra que, al menos en arquitecturas de tipo x86, la sqrt
instrucción es lo suficientemente rápida.
Actualizar
Dado que esta respuesta parece estar recibiendo bastante atención, también me gustaría abordar la segunda parte de su pregunta, es decir, ¿realmente vale la pena intentar mejorar / eliminar operaciones básicas como sqrt
?
En el contexto de las simulaciones de Molecular Dynamics, o cualquier simulación basada en partículas con interacciones limitadas por corte, hay mucho que ganar con mejores algoritmos para encontrar vecinos. Si está utilizando listas de Celdas , o algo similar, para encontrar vecinos o crear una lista Verlet , calculará una gran cantidad de distancias espurias por pares. En el caso ingenuo, solo el 16% de los pares de partículas inspeccionados estarán dentro de la distancia de corte entre sí. Aunque no se calcula la interacción para tales pares, acceder a los datos de partículas y calcular la distancia espuria por pares conlleva un gran costo.
Mi propio trabajo en esta área ( aquí , aquí y aquí ), así como el de otros (por ejemplo, aquí ), muestra cómo se pueden evitar estos cálculos espurios. Estos algoritmos de búsqueda de vecinos incluso superan a las listas de Verlet, como se describe aquí .
El punto que quiero enfatizar es que, aunque puede haber algunas mejoras para obtener de un mejor conocimiento / explotación de la arquitectura de hardware subyacente, también hay ganancias potencialmente mayores para repensar los algoritmos de nivel superior.
rsqrtps
y AVXvrsqrtps
también son estimaciones, obtienen los primeros 11 a 12 bits correctos y debe refinar con una iteración de Newton o dos si desea más precisión. Estas son instrucciones de 5/1 y 7/1 (latencia / rendimiento inverso) en Sandy Bridge (consulte los documentos de Intel o las tablas de instrucciones de Agner Fog que es comparable a la multiplicación. En contraste, la precisión total(v)sqrtps
(o precisión doble(v)sqrtpd
) toma 10-43 / 10-43 (ver las tablas de instrucciones para más detalles).