부동 대 이중 성능


91

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

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


10
나는이 사람이 실제로 더 빠른 경우 다른 사용자가 요청하는대로 뒤에 이유를 묻는 그대로가 정확한 중복 생각하지 않지만 반드시 이유
조안 Venge

아마도 C #의 부동 소수점보다 두 배가 빠릅 니까? (2009 년에 다른 사용자가 소유권을 주장함).
Peter Mortensen

답변:


154

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

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


9
100 년 전이 아닐 수도 있습니다. 일부 FPU는 float, double 및 80 비트 수준에서 기본 처리를 지원하며 더 짧은 길이에서 더 빠르게 실행됩니다. 일부는 실제로 더 짧은 길이로 더 느리게 실행됩니다 ... :-)
Brian Knoblauch

4
가능한 예외 : 분할 시간은 비트 수 (1 클럭 사이클 / 2 비트)에 따라 달라집니다. 내가 플로트 대 이중 분할로 만든 타이밍은 이것으로 집계되는 것 같습니다.
Neil Coffey

21
SIMD 코드에 대한주의 사항-2 배의 부동 소수점을 SIMD 레지스터 (예 : SSE)에 압축 할 수 있으므로 부동 소수점에서 작동하는 것이 더 빠를 수 있습니다. 그러나 그것이 C #이기 때문에 그것은 일어나지 않을 것입니다.
Calyth

13
@P Daddy : 캐시 계층 구조의 모든 수준에서 공간 이점이 중요하다고 생각합니다. 첫 번째 수준의 데이터 캐시가 16KB이고 4000 개의 숫자 배열을 처리하는 경우 float가 쉽게 더 빠를 수 있습니다.
Peter G.

4
@artificialidiot 절대로 말하지 마십시오;). SIMD는 4.6 이후 .NET에서 지원됩니다
ghord

13

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

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

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


6
GPU는 FPU와 완전히 다른 동물입니다. 다른 사람들이 언급했듯이 FPU의 기본 형식은 80 비트 배정 밀도입니다. 그리고 그것은 지금 오랜 시간입니다. 그러나 GPU는 단 정밀도에서이 필드에 접근합니다. 것 잘 알려진 자신의 DP FP (배정 밀도 부동 소수점) 성능은 SP FP 성능의 절반은 종종 정확히입니다. 그들은 종종 SP 부동 소수점 단위를 가지고 있고, 배정 밀도를 커버하기 위해 단위를 재사용해야하는 것 같습니다. 하나에 비해 정확히 두 개의 사이클을 생성합니다. 그것은 내가 직면했을 때 나를 놀라게 한 엄청난 성능 차이 입니다.
Csaba Toth

1
일부 과학적 계산에는 DP FP가 필요하며 주요 GPU 제조업체는 이에 대한 성능 저하를 광고하지 않았습니다. 이제 그들은 (AMD, nVidia) DP 대 SP 주제에서 다소 향상되는 것 같습니다. Intel Xeon Phi의 많은 코어에는 Pentium의 FPU가 포함되어 있으며 Intel은 이중 정밀도 기능을 강조했습니다 . 그것이 GPGPU 몬스터와 실제로 경쟁 할 수있는 곳입니다.
Csaba Toth 2013 년

12

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


3
더 높은 데이터 처리량 때문일까요? 숫자 행렬 (z 버퍼 등)이있는 경우 데이터 크기가 더 중요 해지고 float와 double 간의 변환을 피하면 처리 속도가 빨라집니다. 내 추측.
Lucero

2
의심 할 여지없이 처리량. 또한 특수한 컨텍스트를 고려할 때 float에 double을 사용하여 얻을 수있는 것은 거의 없습니다. 따라서 메모리를 낭비하는 이유는 무엇입니까? 특히 CPU보다 GPU 공급이 짧기 때문에
Cruachan

1
처리량 SP FP (단일 정밀도 부동 소수점)가 DP FP (배 정밀도)보다 GPU 내부 FPU의 기본 형식이라는 사실도 있습니다. @Mene의 답변에 대한 내 의견을 참조하십시오. GPU와 CPU FPU는 매우 다른 동물이며 CPU의 FPU는 DP FP에서 생각하고 있습니다.
Csaba Toth


12

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);
    }

2
그 30 %는 당신이 사용하는 여분의 캐스트 때문일 수 있다고 생각 했습니까 ??
Rasmus Damgaard Nielsen

@RasmusDamgaardNielsen Math이중으로 작업하기 때문에 캐스트는 문제의 일부입니다 . 그러나 당신은 내 게시물을 잘못 읽었습니다. 내 테스트는 성능면에서 더 잘 떠 다니는 것으로 나타났습니다.
Bitterblue 2014 년

2
위에 게시 된 결과는 가짜입니다. 내 테스트에 따르면 릴리스 모드에서 .NET 4.0을 사용하는 이전 32 비트 컴퓨터에서는 floatdouble성능이 거의 동일합니다. (컴파일러 최적화가 방해가되지 않도록) 연속적으로 연결된 변수에 대해 각 시도가 곱하기, 나누기 및 더하기 연산을 실행하는 여러 독립적 시도에서 평균을 낼 때 0.3 % 미만의 차이. 내가 가진 테스트의 두 번째 세트를 시도 Math.Sin()하고 Math.Sqrt()도 동일한 결과를 얻었다.
Special Sauce
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.