2011-09-23 3 views
5

NVCCはどのようにデバイスコードを最適化しますか?定数フォールディングや共通部分式削除のような最適化は何ですか?これにコードの最適化でNVCCはどれくらい効果がありますか?

float a = 1/sqrtf(2 * M_PI); 
float b = c/sqrtf(2 * M_PI); 

例えば、それは次のように削減されます

float a = 1/sqrtf(c * M_PI); 
float b = c/sqrtf(M_PI); 

へ:

float sqrt_2pi = sqrtf(2 * M_PI); // Compile time constant 
float a = 1/sqrt_2pi; 
float b = c/sqrt_2pi; 

何数学関数の意味を知って含む、より巧妙な最適化に関するこれは:

float sqrt_pi = sqrtf(M_PI); // Compile time constant 
float a = 1/(sqrt_pi * sqrtf(c)); 
float b = c/sqrt_pi; 

答えて

8

コンパイラはあなたの前にあります。あなたの例では:第二ケースはこれにコンパイルさ

float b = c/2.50663f; 
float a = 0.398942f; 

に相当する

mov.f32   %f2, 0f40206c99;  // 2.50663 
    div.full.f32 %f3, %f1, %f2; 
    mov.f32   %f4, 0f3ecc422a;  // 0.398942 

float a = 1/sqrtf(2 * M_PI); 
float b = c/sqrtf(2 * M_PI); 

nvopencc(Open64)はこれを放出します

float a = 1/sqrtf(c * 3.14159f); // 0f40490fdb 
float b = c/1.77245f; // 0f3fe2dfc5 

コンパイラによって生成されたaの式は、あなたの "optmized"バージョンよりも正確ですが、ほぼ同じ速度でなければならないと推測しています。

+0

だから、*折りたたんでいますか?そして、どのコンパイラがnvOpen64ですか?それはNVidiaかOSS版ですか? 2番目のケースはどうですか? –

+0

nvOpen64は、[Open64](http://www.open64.net/)(nvccはコンパイラではありません)に基づいたNVIDIAコンパイラです。 – talonmies

+0

私の無知ですが、コンパイラでなければnvccとは何ですか? –

関連する問題