Насколько хорошо NVCC в оптимизации кода? - PullRequest
5 голосов
/ 23 сентября 2011

Насколько хорошо 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;

1 Ответ

8 голосов
/ 23 сентября 2011

Компилятор далеко впереди вас.В вашем примере:

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

nvopencc (Open64) выдаст это:

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

, что эквивалентно

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

Второй случайскомпилировано в это:

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

Я предполагаю, что выражение для a, сгенерированное компилятором, должно быть более точным, чем ваша "optmized" версия, но примерно с той же скоростью.

...