5

C# の Math クラスは、根と累乗を double でのみ実行します。フロートベースの平方根関数と累乗関数を Math2 クラスに追加すると、さまざまな処理が少し速くなる可能性があります (今日はリラクゼーションの日で、最適化はリラックスできると思います)。

だから - ライセンスについて心配する必要のない高速な平方根関数と累乗関数、plskthx。または、私をそこに連れて行くリンク。

4

4 に答える 4

9

ソフトウェアの方法が平方根のハードウェア命令と競合しないことを公理的にとらえます。唯一の問題は、Cコードのインラインアセンブラの時代のように、.NETではハードウェアを直接制御できないことです。

まず、一般的なx86ハードウェアの見通しについて説明しましょう。

浮動小数点x86命令FSQRTには、単精度、倍精度、拡張(80ビットFPレジスタのネイティブ精度)の3つの精度があり、単精度と倍精度のタイミングが25〜40%短くなっています。32ビットx86命令については、ここを参照してください。

それは大きなチャンスのように聞こえるかもしれませんが、それはたった十数時計かそこらです。この種の節約は、関数呼び出しから戻り値までのコードを注意深く管理できない限り、オーバーヘッドで簡単に失われます。マネージC++は(Marcelo Cantosが示唆しているように)C#よりも実用的なベースのように聞こえます。

注:FSQRTのタイミングは、Intelアーキテクチャーで実行ユニットを共有するFDIVと同じであるため、共通のレイテンシーになります。

特殊なC#コードのより良い機会は、おそらくSSE SIMD命令の方向に存在します。ハードウェアでは、最大4つの単精度平方根を並列で実行できます。これに対するJITコンパイラのサポートは何年も前から欠落していますが、現在の開発に関するいくつかの手がかりがあります。

Intelは(2010年12月15日)に飛び込み、.NETFramework4がSIMDで何もしていないことを確認しました。

[Intel PerformanceLibrariesは...C#でのSIMD命令を許可します]

その前でさえ、MonoプロジェクトはMono2.2でSIMDのJITサポートを追加しました。

[Mono:リリースノートMono 2.2]

MS C#からMonoのSIMDサポートを呼び出す可能性は、最近ここで提起されました。

[Microsoft.netからmonoc#コードを呼び出す? - スタックオーバーフロー]

以前の質問では、MonoのSIMDサポートをインストールする方法についても説明しています(ただし、あまり愛されていません!)。

[Mono.Simdを有効にする方法-Stackoverflow]

于 2011-03-18T18:16:15.957 に答える
6

このリンクをチェックしてください:

http://www.codecodex.com/wiki/Calculate_an_integer_square_root

には、さまざまな言語で多数の高速アルゴリズムが用意されています。

元:

// Finds the integer square root of a positive number  
public static int Isqrt(int num) {  
    if (0 == num) { return 0; }  // Avoid zero divide  
    int n = (num / 2) + 1;       // Initial estimate, never low  
    int n1 = (n + (num / n)) / 2;  
    while (n1 < n) {  
        n = n1;  
        n1 = (n + (num / n)) / 2;  
    } // end while  
    return n;  
} // end Isqrt()  

しかし、他にもたくさんあります。一部の C/C++ は最速であると想定されているか、そう主張しています。

POW アルゴリズム チェックについては、単純なものから始めて、そのアルゴリズムに到達する方法の説明に沿って、これをHEREで見つけました。

private double Power(double a, int b) { 
    if (b<0) { 
        throw new ApplicationException("B must be a positive integer or zero"); 
    } 
    if (b==0) return 1; 
    if (a==0) return 0; 
    if (b%2==0) { 
        return Power(a*a, b/2); 
    } else if (b%2==1) { 
        return a*Power(a*a,b/2); 
    } 
    return 0; 
} 
于 2011-03-17T22:01:37.957 に答える
1

ウィキペディアには、平方根の計算に関する詳細な記事があります: http://en.wikipedia.org/wiki/Methods_of_computing_square_roots

x の y 乗を計算する方が簡単です: http://www.osix.net/modules/article/?id=696

私はこのあばた電卓のやり方が好きでした: ここに画像の説明を入力 ... しかし、正直なところ、それが速いかどうかはわかりません。

于 2011-03-17T22:00:10.590 に答える
0

おそらく最も簡単な方法は、Managed C++ で float バージョンを実装することです。それが組み込みのダブルバージョンよりも速くなるかどうかはわかりません.

于 2011-03-17T21:44:23.737 に答える