Я пытаюсь оптимизировать a для l oop, который вычисляет 1 / sqrt (x), где x - значение в 3D-матрице.
for(int i=0;i<=DIM1/2;i++)
for (int j = 0; j <= DIM2/2; j++)
for (int k = 0; k <= DIM3/2; k++)
{
out[i][j][k] = isqrt(in[i][j][k], 1, 0.001);
out[DIM1-i-1][DIM2 - j-1][DIM3 - k-1] = isqrt(in[DIM1 - i-1][DIM2 - j-1][DIM3 - k-1], 1, 0.001);
}
Я попытался вычислить первый элемент и последний в том же l oop, чтобы разделить пополам циклы for, я не знаю, верна ли строка рассуждений, но в любом случае, когда я запускаю код, возвращаемое значение второй инструкции верное, но Я не вижу этого в матрице во время отладки. Если я попытаюсь printf(" %f \n", out[DIM1 - i - 1][DIM2 - j - 1][DIM3 - k - 1]);
Значение правильное, но отсутствует в матрице при отладке, и в конце я попытаюсь распечатать весь выходной массив, но есть нули.
Вот функция
float isqrt(float x, float y0, float epsilon) {
float yKNext = 1.5 * y0 - 0.5 * x * y0 * y0 * y0;
while ((yKNext - y0) > epsilon) {
y0 = yKNext;
yKNext = 1.5 * y0 - 0.5 * x * y0 * y0 * y0;
}
return yKNext;
}
Я пытался последовать вашим советам:
float isqrt(float x, float y0, float epsilon) {
//x= x *0.5f;
//float yKNext = y0 * (1.5f - x * y0 * y0);
double newx = 0.5 * x;
double yK = y0;
double yKNext = 1.5 - newx; //y0=1, i dont need to multiply
while ((yKNext-yK) > 0.00221684015)
{
yK = yKNext;
yKNext = yK * (1.5 - newx * yK * yK);
}
return yKNext;
}
void compute(float in[DIM1][DIM2][DIM3], float out[DIM1][DIM2][DIM3]) {
int i=0, j=0, k=0;
for ( i = 0; i < DIM1; i++)
for ( j = 0; j < DIM2; j++)
for ( k = 0; k < DIM3; k++)
{
out[i][j][k] = isqrt(in[i][j][k], 1, 0.00221684015);
//printf("%f %f\n", out[i][j][k], 1 / sqrt(in[i][j][k]));
}
}
fabs
делает код медленнее, и, если я не ошибаюсь, yKNext
всегда больше yK
. Я не могу изменять прототипы функций, это один из правил упражнения, поэтому я не могу удалять неиспользуемые аргументы, но использование фиксированных значений ускоряет код, и это единственное, что учитывает профессор.