2011-09-23 14 views
5

NVCC, cihaz kodunu ne kadar iyi kullanır? Sürekli katlama ve ortak alt-ifade eleme gibi herhangi bir optimizasyon yapar mı? BunaKod optimizasyonlarında NVCC ne kadar iyi?

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

:

Örn, aşağıdaki azaltacaktır

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

için:

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

ne matematik fonksiyonlarının semantiğini edeceğini içeren daha zeki optimizasyonları, yaklaşık bu:

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

cevap

8

Derleyici önünüzde. Örnekte:

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

nvopencc (open64) bu yayacaktır:

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

ikinci vaka buna derlenmiş

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

eşdeğerdir hangi:

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

Derleyici tarafından oluşturulan a ifadesinin "optmized" sürümünüzden daha doğru olması gerektiğini tahmin ediyorum, ancak aynı hızda.

+0

Yani, * sabit katlama o zaman? Ve ne derleyici nvOpen64 nedir? NVidia veya bir OSS sürümü mü? İkinci davadan ne haber? –

+0

nvOpen64 NVIDIA derleyicisidir, [Open64] (http://www.open64.net/) (not nvcc bir derleyici değildir), – talonmies

+0

Pardon benim cehaletimdir, fakat bir derleyici değilse nvcc tam olarak nedir? –