2017-10-14 9 views
0

Cuda는 intrinsic functions을 지원합니다. 일부는 일반적인 구문으로 표현할 수없는 퓨즈 된 다중 덧셈과 같은 장치 명령어에 매핑됩니다. 기타는 "표준"기능보다 빠르지 만 (잠재적으로 덜 정확하지만) 근사치입니다.__saturatef() intrinsic에는 동일한 배정 밀도가 없습니다.

내재 형식의 후자 유형은 배정 밀도 인수 및 단 정밀도 부동 소수점에 대해서만 지원되는 것으로 보입니다. 의미가 있습니다 : 복식을 사용하는 경우, 정의에 따라 속도에 대한 정확도에 관심이 있습니다.

그러나 놀랍게도 0에서 1 사이의 인수를 클램핑하는 내장형 __saturatef()에는 배정도 버전이 없습니다.

순진한 구현보다 내재적 인 __saturatef()을 사용하면 데이터가 손실 될 가능성이 있습니까? 그렇다면이 내장 함수가 어떻게 작동하는지 누구도 알고 있습니까? 그렇지 않다면 왜 nvidia가 배정도 버전을 생략할까요?

+2

"잠재적 인 데이터 손실"은 무엇을 의미합니까? 예를 들어 줄 수 있습니까? CUDA의 디바이스 내장 함수의 주요 목적은 액세스 할 수없는 하드웨어 기능을 폭로하는 것입니다. 하드웨어는 관련 사용 사례로 인해 단 정밀도 산술 연산을 위해 채도를 제공하지만 배정 밀도 산술을 위해 채도를 제공하지 않습니다. 문제는 경계 밖의 주제입니다. 질문에 대해 다시 말하면 프로그래밍에 관한 내용을 명확하게 제시 할 것을 제안합니다. 예를 들면 다음과 같습니다 : double precision intrinsic'__saturate (double) '이 없다는 것을 감안할 때,이 연산을 에뮬레이션하는 가장 빠른 방법은 무엇입니까? – njuffa

답변

3

CUDA의 디바이스 함수 내장 함수의 목적은 달리 액세스 할 수없는 특정 하드웨어 기능을 노출하는 것입니다. 일부 대수 함수 및 초월 함수에 대한 빠른 근사 또는 __saturatef()의 경우 간격 [0,1]에 클램핑하여 GPU의 기계 명령어 F2F{.FTZ}.F32.F32.SAT에 매핑 한 후 5.0 이전의 컴퓨팅 기능 (sm_50)FADD.SAT 이상 , 컴퓨팅 능력은 5.0.

PTX documentation에보기 그래서. 부동 소수점 포화 반 정밀도 (.f16)와 단 정밀도 (.f32) 작업,하지만 배정 밀도 (.f64) 운영을위한 지원됩니다 보여줍니다 제공된 내장 함수의 비 직교성은 GPU 하드웨어의 비 직교성으로 인해 발생합니다. 채도는 그래픽을 비롯한 관련 사용 사례로 인해보다 낮은 정밀도로 제공됩니다. 이중 정밀도를 사용하지 마십시오.

빠른 시험은 __saturatef (float)fmaxf (fminf (float, 1.0f), 0.0f)과 동일하게 동작 함을 보여줍니다. 디스 어셈블 된 코드를 보면 CUDA 컴파일러가 __saturatef()과 동일한 최소/최대 관용구를 최적화로 처리합니다. 따라서 배정도 상당을 쉽게 만들 수 있습니다.

double my_saturate (double a) 
{ 
    return fmax (fmin (a, 1.0), 0.0); 
}