他のヒント

CUDAを使用した小さなプロジェクトがあり、floatの方が2倍よりも高速だったことを覚えています。一度、ホストとデバイス間のトラフィックが少なくなります(ホストはCPUであり、「通常の」RAMとデバイスはGPUであり、対応するRAMです)。ただし、データが常にデバイス上にある場合でも、処理速度は遅くなります。私はどこかでこれが最近変更されたか、次世代で変更されるはずだと読んだと思いますが、わかりません。

そのため、GPUは単純に倍精度をネイティブに処理できないようです。これは、GLDoubleではなくGLFloatが通常使用される理由も説明します。

(先ほど言ったように、覚えている限りでは、CPUでfloatとdoubleを検索しているときにつまずいただけです。)

これは、 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);
    }

フロートが優先される場合がまだいくつかあります-たとえば、OpenGLコーディングでは、GLDoubleよりもほとんどのGPUで効率的であるため、GLFloatデータ型(16ビットフロートに直接マップされる)を使用することがはるかに一般的です

scroll top