このOpenCLリファレンスシートの3ページ目(リンク切れ)には、同じパラメーターを持つ2つの組み込みベクトル長関数がlength()
ありhalf_length()
ます。
これらの機能の違いは何ですか?私は名前から、一方が他方より「速い」と収集しますが、どのような状況でしょうか?この速度の増加に対して精度が犠牲になりますか?そうでない場合、なぜこれまでに使用length()
するのfast_length()
でしょうか?
このOpenCLリファレンスシートの3ページ目(リンク切れ)には、同じパラメーターを持つ2つの組み込みベクトル長関数がlength()
ありhalf_length()
ます。
これらの機能の違いは何ですか?私は名前から、一方が他方より「速い」と収集しますが、どのような状況でしょうか?この速度の増加に対して精度が犠牲になりますか?そうでない場合、なぜこれまでに使用length()
するのfast_length()
でしょうか?
OpenCL仕様(バージョン1.1、215ページ)によると:
float length(floatn p)
p
:ベクトルの長さを返します。sqrt(p.x²+p.y²+...)
float fast_length(floatn p)
p
:次のように計算されたベクトルの長さを返しますhalf_sqrt(p.x²+p.y²+...)
したがって、をfast_length
使用しhalf_sqrt
、をlength
使用しますsqrt
。ご想像のとおりsqrt
、精度の保証は優れていますが、速度が低下する可能性があります。もっと要点:
最小精度sqrt
:3ulp(最低精度の単位)
最小精度half_sqrt
:8192ulp
したがってhalf_sqrt
、精度は約11sqrt
ビット低くなる可能性があります(厳密に必要な場合よりも優れている必要がないため、実際には13ビット低くなる可能性がありますsqrt
)。(プラス1つの暗黙のビット)float
の仮数があるので、約10ビットの精度(暗黙の1を含む11ビット)のみを約束します。ただし、ハードウェアにそのような機能がある場合は、より高速になる可能性があります。ハードウェアでは、命令が少数のビット(10〜14など)のみを提供し、必要な精度を得るために命令の後にニュートンラプソン反復を使用することは珍しいことではありません。このような場合、使用は明らかに高速です。23bit
half_sqrt
sqrt
rsqrt
half_sqrt