2011-09-23 21 views
5

NVCC tối ưu hóa mã thiết bị như thế nào? Liệu nó có thực hiện bất kỳ loại tối ưu nào như xếp liên tục và loại trừ biểu hiện chung không?NVCC hoạt động tốt như thế nào khi tối ưu hóa mã?

Ví dụ, nó sẽ làm giảm sau:

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

này:

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

gì về tối ưu hóa thông minh hơn, liên quan đến hiểu biết ngữ nghĩa của hàm toán học:

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

để này:

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

Trả lời

8

Trình biên dịch luôn đi trước bạn. Trong ví dụ của bạn:

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

nvopencc (Open64) sẽ phát ra này:

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

tương đương với

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

Trường hợp thứ hai được biên dịch như sau:

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

Tôi đoán biểu thức cho a được tạo bởi trình biên dịch phải chính xác hơn phiên bản "được tối ưu hóa" của bạn, nhưng về cùng tốc độ.

+0

Vì vậy, nó * * liên tục gấp sau đó? Và trình biên dịch nào là nvOpen64? Đó là phiên bản của NVidia hay một phiên bản OSS? Còn trường hợp thứ hai thì sao? –

+0

nvOpen64 là trình biên dịch NVIDIA, dựa trên [Open64] (http://www.open64.net/) (lưu ý nvcc không phải là trình biên dịch), – talonmies

+0

Xin lỗi vì sự thiếu hiểu biết của tôi, nhưng chính xác thì nvcc là gì nếu nó không phải là trình biên dịch? –

Các vấn đề liên quan