ホーム ] PC技術/システム技術 ] VB.NETプログラミング ] なるほどナレッジ ] インフォメーション ]

上へ
関数共通仕様
システム変数
定数
符号変換
関係演算
丸め演算
加減算
乗算
除算/逆数
整数除算/剰余算
平方根/立方根
階乗算
指数関数
対数関数
三角関数
逆三角関数
双曲線関数
逆双曲線関数
階乗評価関数
級数評価関数
ニュートン評価関数
演算時間評価関数

UltraMath

演算時間評価関数

最終更新日:2006/06/17 修正

●概要 

 UltraPrecitionがインストールされた環境、CPUに於けるUltraPrecision による演算時間を予測する。 実測値を加工し、線形補間により算出している。

●条件

 この関数が動作するには、予め、ユーティリティにより、"システム測定/設定"メニューにてテーブルを生成しておく必要がある。 対応するテーブルがないと、値0 が返る。

●関数仕様

○列挙体/構造体

 評価する演算のパラメータを指定するための列挙体/構造体である。

Public Enum Operation
   Comp = 1
   AddSubt
   Mul  
   MulI
   MulS             '自動選択乗算で、MulSLimt に従う
   MulSd           '特殊 常にMulSの時間となる
   FMul 
   Div
   DivI  
   RDiv
End Enum

Public Structure OperationParam
   Public Operation As Operation      '演算種
   Public SubPrecision As Integer      '副精度(実桁数):Div/Mul/MulS/MulSd の場合にのみ有効
   Public N As Integer                     '演算回数

   Sub New(OP As Operation, SP As Integer, N As Integer)
      Me.Operation = OP
      Me.SubPrecision = SP
      Me.N = N
   End Sub

   Sub New(OP As Operation, SP As Integer)
      Me.Operation = OP
      Me.SubPrecision = SP
      Me.N = 1
   End Sub
End Structure  

○時間関数チェック

IsReadyEstimateTime() As Boolean

 演算時間評価のためのテーブルが全て準備されていれば、True が返る。
  

○個別時間関数

GetOperationTime(MainPrecision As Integer, Operation As Operation, SubPrecision As Integer) As Double

 Operation に演算種、Precision に主精度(演算する実際の桁数)、もし、MulS/MulSd の場合は、SubPrecision に、16〜1024 の桁数を8 の倍数で指定する。Div の場合でも、SubPrecision = 8 であれば、DivI と評価される。Mul の場合でも、SubPrewcision = 8 であれば、MulI、MulsLimit 以内であればMulS と評価される。自動選択乗除算が完全にシミュレートされる。単独演算の単位演算時間が ns で返る。

○組合せ時間関数

EstimateCalculationTime(MainPrecision As Integer, Param() As OperationParam) As Double

 Param配列に、必要な演算のパラメータを与えると、それら全ての合計演算時間が返る。単位は、ns。

<用例>

・例1

公称精度が 8032桁で、

 C = Add(W, Mul(Mul(X, X), Add(Y, Z))) では、

Calc() As OperationParam = {New OperationParam(Operation.Mul, 0, 2)
                                       , New OperationParam(Operation.AddSubt, 0, 2)}

EstimateCalculationTme(8032, Calc) 

とする。

・例2

公称精度が 120032桁で、

Do
   S = Div(Mul(S, A), N)
   SM = Add(SM, S)
   If S.IsZero OrElse S.Exponent < -PP Then Exit Do
   N = N + 1
Loop

 (N が1億未満、Sが32桁の短い多倍長の場合)

Calc() As OperationParam = {New OperationParam(Operation.MulS, 32, 1)
                                       , New OperationParam(Operation.AddSubt, 0, 1)
                                       , New OperationParam(Operation.DivI, 0, 1)}}

EstimateCalculationTme(120032, Calc)

が、1ループ当りの演算時間となる。

通常、LoopIf S.IsZero OrElse S.Exponent < -PP や、N = N + 1 は、無視して も時間評価には問題ない。

○演算時間表示

ShowCalculationTime(ByVal Time As Double, ByVal Mode As Integer) As String

 ns で表された時間を文字列にする。nS、μS、mS、S などが自動的に変換される。有効桁数は4桁程度となる。(それ以上は無意味なので)

  • Mode = 0 :単位を秒までとする
  • Mode = 1 :単位を時、分、秒までとする

<用例>

 ShowCalculateTime(123400000000, 0 )  → 123.4 S
 ShowCalculateTime(123400000000, 1 )  → 2 M 3.4 S

 ○二進展開評価関数

 ・BinaryMethodCount(ByVal A As Long) As Integer

  XA二進展開法で冪乗する場合の乗算回数を返す。 一般に乗算回数は、Log2A - 1 と 2*Log2A - 1 の間の値となる。