Como uma extensão da resposta de moyner , o on-chip sqrt
é geralmente um rsqrt
, ou seja, uma raiz quadrada recíproca que calcula . Portanto, se em seu código você usar apenas1/r(se estiver fazendo dinâmica molecular), poderá calculardiretamente e salvar a divisão. A razão pela qualé computada em vez deé que sua iteração de Newton não tem divisões, apenas adições e multiplicações.a→1/a−−√1/rr = rsqrt(r2)
rsqrt
sqrt
Como observação, as divisões também são computadas iterativamente e são quase tão lentas quanto rsqrt
no hardware. Se você procura eficiência, é melhor tentar remover divisões supérfluas.
Algumas arquiteturas mais modernas, como as arquiteturas POWER da IBM, não fornecem rsqrt
per se, mas uma estimativa precisa de alguns bits, por exemplo, FRSQRTE . Quando um usuário chama rsqrt
, isso gera uma estimativa e, em seguida, uma ou duas (quantas forem necessárias) iterações do algoritmo de Newton ou Goldschmidt usando multiplicações e adições regulares. A vantagem dessa abordagem é que as etapas da iteração podem ser canalizadas e intercaladas com outras instruções sem bloquear a FPU (para uma visão geral muito boa desse conceito, embora em arquiteturas mais antigas, consulte a tese de doutorado de Rolf Strebel ).
Para potenciais de interação, a sqrt
operação pode ser totalmente evitada usando um interpolante polinomial da função potencial, mas meu próprio trabalho (implementado em mdcore
) nesta área mostra que, pelo menos nas arquiteturas do tipo x86, a sqrt
instrução é rápida o suficiente.
Atualizar
Como essa resposta parece estar recebendo bastante atenção, eu também gostaria de abordar a segunda parte da sua pergunta, ou seja, vale a pena tentar melhorar / eliminar operações básicas como sqrt
?
No contexto de simulações de Dinâmica Molecular, ou qualquer simulação baseada em partículas com interações limitadas por corte, há muito a ser ganho com os melhores algoritmos para encontrar vizinhos. Se você estiver usando listas de células , ou algo semelhante, para encontrar vizinhos ou criar uma lista de Verlet , estará computando um grande número de distâncias falsas aos pares. No caso ingênuo, apenas 16% dos pares de partículas inspecionados estarão realmente dentro da distância de corte um do outro. Embora nenhuma interação seja computada para esses pares, o acesso aos dados das partículas e o cálculo da distância espúria dos pares acarreta um custo alto.
Meu próprio trabalho nesta área ( aqui , aqui e aqui ), bem como o de outros (por exemplo, aqui ), mostra como esses cálculos espúrios podem ser evitados. Esses algoritmos de localização de vizinhos até superam as listas Verlet, conforme descrito aqui .
O ponto que quero enfatizar é que, embora possa haver algumas melhorias a serem obtidas com o melhor conhecimento / exploração da arquitetura de hardware subjacente, também existem ganhos potencialmente maiores para repensar os algoritmos de nível superior.
rsqrtps
e AVXvrsqrtps
também são estimativas, eles corrigem os primeiros 11 a 12 bits e você deve refinar com uma iteração de Newton ou duas, se desejar mais precisão. Estas são as instruções 5/1 e 7/1 (latência / taxa de transferência inversa) no Sandy Bridge (consulte os documentos da Intel ou as tabelas de instruções da Agner Fog que são comparáveis à multiplicação. Por outro lado, a precisão total(v)sqrtps
(ou precisão dupla(v)sqrtpd
) leva de 10 a 43 / 10-43 (consulte as tabelas de instruções para obter detalhes).