amarao_san

Categories:

очевидная оптимизация

(вдогонку к предыдущему посту)

Да, казалось бы, очевидная оптимизация: сначала lattice 2x2 (я даже думал, сделать её 2x1, с диагональными значениями), а потом уже более частая lattice по точкам, которые уже не корни. 

Однако, одна-единственная в цикле 'if' сделала так, что просто профигачить lattice 23х23 быстрее, чем сначала lattice 2x2, а потом только по избранным, 23х23. Если что, на первой итерации из примерно 2М точек выпиливается 200к, т.е. 10%.

if жрёт больше, чем 10%.

Код с оптимизацией:

Rendered in 439.320679ms, 217054 roots
Rendered and uprendered in 44.161920525s, 306692 roots

Код без оптимизации:

Rendered in 43.830699015s, 306692 roots

При этом что-либо мутить тут бесполезно — 23х23 — это 529 уравнений на пиксел, в сумме 1096934400 уравнений. Я пытался его заменить на 982981050 (разница 113953350). Один 217 тысяч if'ов стоит больше, чем 113 миллионов уравнений. Каждое уравнение — два деления и два синуса. 217 тысяч if'ов дороже, чем полмиллиарда flop (f32)?!!!

Я просто не верю. У меня где-то баг.

Вот код с if'ом:

fn up_render<F>(canvas: &mut Canvas, f: &F, lattice_dim:usize) where

    F: Fn(Float, Float) -> Float

{

    for pixel in canvas.iter(){

        if canvas.img[pixel.index]!=0u32 {

            if pixel.sign_change_on_lattice(f, &canvas, lattice_dim){

                canvas.set_pixel(&pixel, 0);

            }

        }

    }

}

Код без if'а, соответственно, без строчки «if canvas.img[pixel.index]!=0u32 {»

pixel — это struct Pixel {index: usize}, т.е. никакой магии не добавляет, кроме ассоциированных методов.

Error

default userpic

Your IP address will be recorded 

When you submit the form an invisible reCAPTCHA check will be performed.
You must follow the Privacy Policy and Google Terms of use.