의 계산 비용은


26

분자 시뮬레이션에서 다루어야 할 주요 문제 중 하나는 거리 의존적 힘의 계산입니다. 우리는 이격 거리의에도 힘을 가지고 힘과 거리의 기능을 제한 할 수있는 경우 , 우리는 거리의 제곱 계산할 수 있습니다 R 2 = R 연구를 하고에 대해 걱정할 필요가 없습니다 R . 그러나 이상한 힘이 있다면 r = 를 처리해야합니다.rr2=rrr .r=r2

내 질문은 : 컴퓨팅 비용은 얼마나 비싸다 공용 언어 (C / C ++, Fortran, Python) 등의 라이브러리에서 구현 된 것? 특정 아키텍처에 대한 코드를 수동 조정하여 성능을 크게 향상시킬 수 있습니까?x

답변:


39

moyner의 답변에 대한 확장으로 , 온칩 sqrt은 일반적으로 rsqrt 즉, 1 / 를 계산 하는 역수 제곱근입니다.. 따라서 코드에서1/r만 사용하면 (분자 역학을 수행하는 경우)직접계산하여 나눗셈을 저장할수 있습니다. 그대신 계산되는 이유는 뉴턴 반복에 나누기가없고 덧셈과 곱셈 만 있기 때문입니다.a1/a1/rr = rsqrt(r2)rsqrtsqrt

부수적으로, 부서도 반복적으로 계산되며 거의 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 목록보다 성능이 뛰어 납니다 .

내가 강조하고 싶은 점은 기본 하드웨어 아키텍처를 잘 알고 / 탐험함으로써 얻을 수있는 약간의 개선이있을 수 있지만, 더 높은 수준의 알고리즘을 다시 생각하면 잠재적으로 더 큰 이득이 있다는 것입니다.


6
SSE rsqrtps와 AVX vrsqrtps도 추정치이며, 첫 11 ~ 12 비트가 정확하므로 더 정확한 결과를 원한다면 Newton 반복으로 2 ~ 2 개 수정해야합니다. Sandy Bridge에 대한 5/1 및 7/1 (대기 시간 / 역 처리량) 명령입니다 ( 곱하기에 필적하는 Intel 문서 또는 Agner Fog의 명령 표 참조) . 전체 정확도 (v)sqrtps(또는 배정도 (v)sqrtpd)는 10-43 / 10-43 (자세한 내용은 지침 표 참조)
Jed Brown

@JedBrown : 지적 해 주셔서 감사합니다! 나는 SSE와 그 확장이 이것을 제공한다는 것을 잊었다.
Pedro

16

제곱근은 대부분의 프로세서에서 하드웨어로 구현됩니다. 즉, 특정 조립 지침이 있으며 성능을 구현하기가 매우 어렵 기 때문에 대부분의 언어에서 성능을 비교할 수 있어야합니다. FSQRT 명령은 일부 스마트 하드웨어 디자이너가 설계했기 때문에 절대 이길 수 없을 것입니다.

하드웨어에서 구현되는 방법은 다양 할 수 있지만, 필요한 자릿수를 계산할 때까지 특정 반복 횟수를 수행하는 Newton-Raphson의 방법과 같은 일종의 고정 소수점 반복 일 수 있습니다. 하드웨어의 반복 방법은 일반적으로 다른 작업보다 훨씬 느립니다. 결과가 준비되기 전에 여러주기를 완료해야하기 때문입니다.

XMM 레지스터에서 사용할 수있는 스트리밍 SIMD 명령어있습니다 . 여기 에는 빠른 벡터 계산이 있습니다 . 이 레지스터는 상당히 작지만 알려진 좌표 수 (예 : 3 차원 데카르트 좌표계)가있는 경우 상당히 빠릅니다.

언어의 수준이 충분히 낮은 경우 항상 정밀도를 낮추거나 좌표에 정밀도가 낮은 숫자를 사용할 수 있습니다. 단 정밀도는 종종 충분히 우수하며 반복을 조기에 종료 할 수 있기 때문에 제곱근을 계산할 때 내가 기억하는 것보다 빠릅니다.

다른 언어를 벤치마킹하기에 충분히 쉬워야합니다. 파일에 일련의 긴 임의의 숫자를 작성하고 다른 언어를 사용하여로드 한 다음 제곱근의 시간을 정하면됩니다.


0

성능 향상이있을 수 있지만, 먼저 sqrt의 역수 계산은 병목 현상 (위치를로드하고 힘을 절약하는 것이 아님)임을 알아야합니다.

GROMACS MD 프로젝트는 IEEE 부동 소수점 형식의 세부 정보를 활용하여 제곱근의 역수에 대한 근사치를 계산하기위한 Newton-Raphson 반복 체계를 시드하려는 아이디어로 성장했습니다 ( http : / 의 부록 B.3 참조) . /www.gromacs.org/Documentation/Manual )에 있지만 GROMACS가이 아이디어를 계속 사용하는 HPC CPU는 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.