문제

나는 약간의 타이밍 테스트를했고 다음과 같은 기사를 읽었습니다. 이 하나 (마지막 주석), 릴리스 빌드, 플로트 및 이중 값은 동일한 양의 처리 시간을 사용합니다.

이것이 어떻게 가능한지? 플로트가 이중 값에 비해 덜 정확하고 작은 경우 CLR이 어떻게 동일한 처리 시간으로 두 배가 될 수 있습니까?

도움이 되었습니까?

해결책

적어도 x86 프로세서에서 float 그리고 double 처리를 위해 FPU에 의해 각각 10 바이트 리얼로 변환됩니다. FPU에는 지원하는 다양한 부동 소수점 유형에 대한 별도의 처리 장치가 없습니다.

오래된 조언 float 보다 빠릅니다 double 100 년 전 대부분의 CPU에 FPU가 내장되어 있지 않은 경우 (그리고 별도의 FPU 칩을 가진 사람이 거의 없음), 대부분의 부동 소프트 포인트 조작이 소프트웨어에서 수행되었습니다. 이 기계에서 (용암 구덩이에 의해 생성 된 증기로 구동되는) ~였다 더 빨리 사용합니다 float에스. 이제 유일한 진정한 혜택 floatS는 공간을 덜 차지한다는 것입니다 (수백만 명이있는 경우에만 중요합니다).

다른 팁

나는 Cuda를 사용한 작은 프로젝트를 가지고 있었고 Float도 두 배보다 빠르다는 것을 기억할 수 있습니다. 일단 호스트와 장치 사이의 트래픽이 더 낮습니다 (호스트는 CPU이고 "정상"RAM과 장치는 GPU이고 해당 RAM입니다). 그러나 데이터가 장치에 항상 존재하더라도 느리게됩니다. 나는 이것이 최근에 바뀌 었거나 다음 세대와 함께 변화해야한다고 생각하지만 확실하지 않습니다.

따라서 GPU는이 경우 기본적으로 이중 정밀도를 처리 할 수없는 것 같습니다. 이는 Glfloat가 일반적으로 Gldouble보다는 일반적으로 사용되는 이유를 설명 할 것입니다.

(내가 기억할 수있는 한, 내가 기억할 수있는 한, CPU에서 Float vs. Double을 검색하는 동안 이것을 우연히 발견했습니다.)

그것은 의존합니다 32 비트 또는 64 비트 체계. 64 비트로 컴파일하면 더블이 더 빠릅니다. 64 비트 (기계 및 OS)에서 32 비트로 컴파일 된 플로트는 약 30% 더 빠릅니다.

    public static void doubleTest(int loop)
    {
        Console.Write("double: ");
        for (int i = 0; i < loop; i++)
        {
            double a = 1000, b = 45, c = 12000, d = 2, e = 7, f = 1024;
            a = Math.Sin(a);
            b = Math.Asin(b);
            c = Math.Sqrt(c);
            d = d + d - d + d;
            e = e * e + e * e;
            f = f / f / f / f / f;
        }
    }

    public static void floatTest(int loop)
    {
        Console.Write("float: ");
        for (int i = 0; i < loop; i++)
        {
            float a = 1000, b = 45, c = 12000, d = 2, e = 7, f = 1024;
            a = (float) Math.Sin(a);
            b = (float) Math.Asin(b);
            c = (float) Math.Sqrt(c);
            d = d + d - d + d;
            e = e * e + e * e;
            f = f / f / f / f / f;
        }
    }

    static void Main(string[] args)
    {
        DateTime time = DateTime.Now;
        doubleTest(5 * 1000000);
        Console.WriteLine("milliseconds: " + (DateTime.Now - time).TotalMilliseconds);

        time = DateTime.Now;
        floatTest(5 * 1000000);
        Console.WriteLine("milliseconds: " + (DateTime.Now - time).TotalMilliseconds);

        Thread.Sleep(5000);
    }

그러나 플로트가 선호되는 경우가 여전히 남아 있습니다. 예를 들어 OpenGL 코딩과 함께 Glfoat 데이터 유형을 사용하는 것이 훨씬 일반적입니다 (일반적으로 16 비트 플로트에 직접 매핑 됨).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top