1

このOpenCLリファレンスシートの3ページ目(リンク切れ)には、同じパラメーターを持つ2つの組み込みベクトル長関数がlength()ありhalf_length()ます。

これらの機能の違いは何ですか?私は名前から、一方が他方より「速い」と収集しますが、どのような状況でしょうか?この速度の増加に対して精度が犠牲になりますか?そうでない場合、なぜこれまでに使用length()するのfast_length()でしょうか?

4

1 に答える 1

7

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など)のみを提供し、必要な精度を得るために命令の後にニュートンラプソン反復を使用することは珍しいことではありません。このような場合、使用は明らかに高速です。23bithalf_sqrtsqrtrsqrthalf_sqrt

于 2012-04-17T21:09:53.927 に答える