단일 대 이중 부동 소수점 정밀도


13

단 정밀도 부동 소수점 숫자는 메모리의 절반을 차지하고 최신 기계 (GPU에서도)는 배정도에 비해 거의 두 배의 속도로 작업을 수행 할 수 있습니다. 내가 찾은 많은 FDTD 코드는 독점적으로 단 정밀도 산술 및 저장을 사용합니다. 대규모 희소 방정식 시스템을 푸는 데 단 정밀도를 사용할 수있는 경우에 대한 경험 규칙이 있습니까? 매트릭스 조건 번호에 크게 의존해야한다고 가정합니다.

또한, 필요한 경우 배정 밀도를 사용하고 배정 밀도가 필요하지 않은 단일 정밀도를 사용하는 효과적인 기술이 있습니까? 예를 들어, 행렬 벡터 곱셈 또는 벡터 내적 곱의 경우 결과를 배정 밀도 변수 (취소 오류를 피하기 위해)에 누적하는 것이 좋지만 개별 항목을 서로 곱하는 것이 좋습니다. 단 정밀도를 사용하여 곱할 수 있습니다.

현대식 FPU는 단 정밀도 (float)에서 배정 밀도 (double)로 또는 그 반대로 완벽하게 변환 할 수 있습니까? 아니면 비용이 많이 드는 작업입니까?

답변:


7

모든 사소한 문제 (성능이 중요한 문제)의 경우 거의 모든 메모리가 매트릭스에 있고 상대적으로 벡터가 거의 없습니다. 예를 들어, Stokes 방정식의 3d Taylor-Hood 요소의 경우 행렬에 행당 수백 개의 요소가 있으며 이는 벡터에 필요한 메모리의 양보다 훨씬 큽니다. 따라서 행렬을 플로트로 저장하고 벡터를 더블로 저장한다는 아이디어를 가지고 놀았습니다. 타이밍 결과는 기억 나지 않지만 반올림 등의 문제는 발견되지 않았습니다. 따라서이 방법은 확실히 작동합니다.


고마워요, 뱅 거스 교수 반복 행렬 솔버는 어떻습니까? 행렬-벡터 곱의 최대 정밀도를 두 배로 늘리거나 곱셈의 경우 벡터 요소를 단일로 낮추고 누적을 위해 두 배로 다시 스케일합니까?
Costis

나는 물론 반복 솔버에 대해 이야기하고있었습니다. 중요하지 않기 때문에 모든 벡터를 배정 밀도로 수행하므로 dst = matrix src 연산은 double = float double 로 발생합니다 . 축적은 배정 밀도로 발생하지만 실제로 중요하다면 놀랄 것입니다.
Wolfgang Bangerth

20 년 전부터 어딘가에 도트 제품이 배정도보다 높은 정밀도로 수행되어야한다는 논문이 있습니다. 편리한 참조 자료는 없지만 나중에 찾을 수 있는지 살펴 보겠습니다.
Bill Barth 2016 년

네, 놀라지 않을 것입니다. 그것은 또한 우리가하는 것과 일치합니다.
Wolfgang Bangerth 2016 년

도트 제품에 쿼드 정밀도를 사용하십니까? 그렇다면 멋지다! 도서관에서이 일을하는 사람은 없었습니다.
Bill Barth


3

내 조언은 단 정밀도 (부동)를 사용할 때 결정을 위해 주로 메모리 소비에 중점을 두는 것입니다. 따라서 FDTD 계산을위한 벌크 데이터는 float을 사용해야하지만 문제 설명 자체 (예 : 지오메트리, 재료 매개 변수, 여기 조건) 및 모든 관련 메타 데이터를 이중으로 유지합니다.

나는 모든 성능을 중요하지 않고 깊이 계산하지 않은 계산을 두 배로 유지합니다. 특히, 다각형 데이터와 기하학에 대한 다른 설명을 두 배로 (가능하면 정수로) 유지하려고합니다. 경험에 따르면 이론적으로는 가능하더라도 코드의 계산 기하학 부분을 완전히 견고하게 얻을 수는 없습니다.

이중으로 유지하려는 세 번째 부분은 비대칭 고유 값 분해를 사용하는 바로 가기를 포함하여 분석 계산입니다. 예를 들어, 조각으로 정의 된 회전 대칭 2D 함수가 있으며 푸리에 변환이 필요합니다. FFT와 "효율적인"분석을위한 적절한 "분석적 저역 통과 필터"를 포함하는 다양한 수치 방법이 있습니다. 성능이 중요하지 않기 때문에 대신 Bessel 함수를 포함하는 "정확한"분석 식을 사용했습니다. 이것이 바로 가기 였기 때문에 복잡한 수식의 오류 전파를 분석하는 데 시간을 소비하지 않으므로 해당 계산에 배정 밀도를 사용하는 것이 좋습니다. (여전히 공식에 대한 분석적 등가 표현 중 일부만 사용할 수 있음이 밝혀졌습니다.

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