moyner의 답변에 대한 확장으로 , 온칩 sqrt
은 일반적으로 →rsqrt
즉, 1 / √ 를 계산 하는 역수 제곱근입니다.. 따라서 코드에서1/r만 사용하면 (분자 역학을 수행하는 경우)직접계산하여 나눗셈을 저장할수 있습니다. 그대신 계산되는 이유는 뉴턴 반복에 나누기가없고 덧셈과 곱셈 만 있기 때문입니다.a→1/a−−√1/rr = rsqrt(r2)
rsqrt
sqrt
부수적으로, 부서도 반복적으로 계산되며 거의 rsqrt
하드웨어에서 와 같이 느립니다 . 효율성을 찾고 있다면 불필요한 부서를 제거하는 것이 좋습니다.
IBM의 POWER 아키텍처와 같은 일부 최신 아키텍처 는 개별적으로 제공하지 않지만 FRSQRTErsqrt
와 같이 몇 비트에 정확한 추정치를 제공합니다 . 사용자가 호출 하면 추정값을 생성 한 다음 정기적 인 곱셈과 덧셈을 사용하여 Newton 또는 Goldschmidt 알고리즘의 1-2 회 (필요한 횟수만큼) 반복을 생성합니다. 이 접근 방식의 장점은 FPU를 차단하지 않고 반복 단계를 파이프 라인하고 다른 명령어와 인터리브 할 수 있다는 것입니다 (이 아키텍처에 대한 아주 좋은 개요는 구식 아키텍처에도 불구하고 Rolf Strebel의 PhD 논문 참조 ).rsqrt
인터랙션 포텐셜 sqrt
의 경우 포텐셜 함수의 다항식 보간을 사용하여 작업을 완전히 피할 수 있지만 이 영역에서 구현 한 내 작업 ( mdcore
최소 x86 유형 아키텍처에서는 sqrt
명령이 충분히 빠름)이 표시됩니다.
최신 정보
이 답변은 꽤 주목을 받고있는 것 같으므로 질문의 두 번째 부분을 해결하고 싶습니다. 예를 들어 sqrt
?
Molecular Dynamics 시뮬레이션 또는 컷오프 제한 상호 작용을 사용하는 입자 기반 시뮬레이션의 맥락에서, 이웃 찾기를위한 더 나은 알고리즘을 통해 얻을 수 있는 것이 많습니다 . 셀 목록 또는 이와 유사한 것을 사용하여 이웃을 찾거나 Verlet 목록을 작성하는 경우 많은 수의 가짜 쌍별 거리를 계산하게됩니다. 순진한 경우, 검사 된 입자 쌍의 16 %만이 실제로 서로의 컷오프 거리 내에있게됩니다. 그러한 쌍들에 대해 상호 작용이 계산되지는 않지만, 입자 데이터에 액세스하고 스퓨리어스 쌍방향 거리를 계산하는 데는 많은 비용이 든다.
이 영역 ( here , here , here )과 다른 사람 (예 : here ) 에서의 저의 작업은 이러한 가짜 계산을 피할 수있는 방법을 보여줍니다. 이 이웃 찾기 알고리즘은 여기에 설명 된 것처럼 Verlet 목록보다 성능이 뛰어 납니다 .
내가 강조하고 싶은 점은 기본 하드웨어 아키텍처를 잘 알고 / 탐험함으로써 얻을 수있는 약간의 개선이있을 수 있지만, 더 높은 수준의 알고리즘을 다시 생각하면 잠재적으로 더 큰 이득이 있다는 것입니다.
rsqrtps
와 AVXvrsqrtps
도 추정치이며, 첫 11 ~ 12 비트가 정확하므로 더 정확한 결과를 원한다면 Newton 반복으로 2 ~ 2 개 수정해야합니다. Sandy Bridge에 대한 5/1 및 7/1 (대기 시간 / 역 처리량) 명령입니다 ( 곱하기에 필적하는 Intel 문서 또는 Agner Fog의 명령 표 참조) . 전체 정확도(v)sqrtps
(또는 배정도(v)sqrtpd
)는 10-43 / 10-43 (자세한 내용은 지침 표 참조)