私はいくつかのタイミング テストを行い、この記事(最後のコメント) のような記事も読みました。リリース ビルドでは、float 値と double 値の処理に同じ時間がかかるようです。
これはどのように可能ですか?float が double 値に比べて精度が低く、小さい場合、CLR はどのようにして double を同じ処理時間に入れることができますか?
私はいくつかのタイミング テストを行い、この記事(最後のコメント) のような記事も読みました。リリース ビルドでは、float 値と double 値の処理に同じ時間がかかるようです。
これはどのように可能ですか?float が double 値に比べて精度が低く、小さい場合、CLR はどのようにして double を同じ処理時間に入れることができますか?
x86 プロセッサでは、少なくともfloat
とdouble
はそれぞれ、処理のために FPU によって 10 バイトの実数に変換されます。FPU には、サポートするさまざまな浮動小数点型用の個別の処理ユニットがありません。
ほとんどの CPU に FPU が組み込まれていなかった (そして、別の FPU チップを持っている人はほとんどいなかった) 100 年前に適用された古いアドバイスfloat
よりも速く適用されたため、ほとんどの浮動小数点操作はソフトウェアで行われました。double
これらのマシン (溶岩ピットによって生成された蒸気によって駆動された) では、 s を使用する方が高速でしfloat
た。s の唯一の本当の利点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);
}
私は CUDA を使用した小さなプロジェクトを持っていましたが、そこでも float が double よりも高速だったことを思い出すことができます。一時的に、ホストとデバイス間のトラフィックが減少します (ホストは CPU であり、「通常の」RAM であり、デバイスは GPU であり、対応する RAM です)。ただし、データが常にデバイスに存在する場合でも、速度は低下します。これが最近変更された、または次の世代で変更されるはずだとどこかで読んだと思いますが、よくわかりません。
したがって、これらの場合、GPU は単純に倍精度をネイティブに処理できないようです。これは、GLDouble ではなく GLFloat が通常使用される理由も説明します。
(私が言ったように、覚えている限りでは、CPU で float と double を検索しているときにこれに出くわしました。)
ただし、浮動小数点が優先される場合もあります。たとえば、OpenGL コーディングでは、ほとんどの GPU で GLDouble よりも効率的であるため、GLFloat データ型 (一般に 16 ビット浮動小数点に直接マップされる) を使用する方がはるかに一般的です。