Насколько хорошо NVCC оптимизирует код устройства? Делает ли он какие-нибудь оптимизации вроде сворачивания констант и устранения общих подвыражений?
Например, сократит ли он следующее:
float a = 1 / sqrtf(2 * M_PI);
float b = c / sqrtf(2 * M_PI);
до этого:
float sqrt_2pi = sqrtf(2 * M_PI); // Compile time constant
float a = 1 / sqrt_2pi;
float b = c / sqrt_2pi;
Что насчет более умных оптимизаций, включающих знание семантики математических функций:
float a = 1 / sqrtf(c * M_PI);
float b = c / sqrtf(M_PI);
до этого:
float sqrt_pi = sqrtf(M_PI); // Compile time constant
float a = 1 / (sqrt_pi * sqrtf(c));
float b = c / sqrt_pi;