[c#] 부동 대 이중 성능

좀 타이밍 테스트를했고, 또한 같은 몇 가지 기사를 읽고 이 하나 (최근 코멘트), 그리고 릴리스 빌드, float과 double 값을 처리하는 동일한 시간이 걸릴에서처럼 보인다.

이것이 어떻게 가능한지? float가 double 값에 비해 덜 정확하고 작을 때 CLR은 어떻게 동일한 처리 시간에 두 배가 될 수 있습니까?



답변

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

대부분의 CPU에 FPU가 내장되어 있지 않았고 (별도의 FPU 칩을 가진 사람이 거의 없었던) 100 년 전보다 float더 빠른 오래된 조언으로 double대부분의 부동 소수점 조작은 소프트웨어에서 수행되었습니다. (용암 구덩이에서 생성 된 증기로 구동되는)이 기계 에서는 s 를 사용 하는 것이 더 빠릅니다 float. 이제 floats 의 유일한 이점 은 공간을 덜 차지한다는 것입니다 (수백만 개가있는 경우에만 중요 함).


답변

CUDA를 사용하는 작은 프로젝트가 있었고 float가 두 배보다 빠르다는 것을 기억할 수 있습니다. 일단 호스트와 장치 사이의 트래픽이 더 적습니다 (호스트는 CPU이고 “일반”RAM 및 장치는 GPU 및 해당 RAM). 그러나 데이터가 항상 장치에 상주하더라도 속도가 느립니다. 최근에 바뀌 었거나 다음 세대와 함께 바뀔 것이라고 어딘가에서 읽은 것 같지만 확실하지 않습니다.

따라서 GPU는 이러한 경우 기본적으로 배정 밀도를 처리 할 수없는 것 같습니다. 이는 또한 GLDouble이 아닌 GLFloat가 일반적으로 사용되는 이유를 설명합니다.

(내가 기억할 수있는 한, CPU에서 float vs. double을 검색하는 동안이 문제를 발견했습니다.)


답변

그러나 여전히 float가 선호되는 경우가 있습니다.


답변

32 비트 또는 64 비트 시스템 에 따라 다릅니다 . 64 비트로 컴파일하면 double이 더 빠릅니다. 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);
    }


답변