Subject: [FFC-dev] remove_unused() - bottleneck

From: Kristian Oelgaard <[email-masked]>
Date: Fri, 15 Jun 2007 16:07:12 +0200

Currently I'm compiling simple forms like:

e_u   = FiniteElement("Lagrange", "triangle", 10)
e_uh  = FiniteElement("Lagrange", "triangle", 5)
u   = Function(e_u)
uh  = Function(e_uh)
a = (u - uh)*(u - uh)*dx

which takes roughly 2min to compile. The code generation is very fast but
formatting the output takes forever. With quadrature the above form compiles in
1-2s and so does tensor representation if I do:

#ufc_code["tabulate_tensor"] = remove_unused(body)
ufc_code["tabulate_tensor"] = body

in __generate_cell_integral() (ufcformat.py)

So avoiding the use of remove_unused(), at least when generating code for
tabulate_tensor() would be preferable.

Currently the code generation in tensorgenerator.py is executed in the same
order as the code appear in the resulting header file i.e.

coefficients -> geometry -> sign_code -> element_code

and then in ufcformat.py we put the jacobian in front of everything after which
we hand over the code to remove_unused()

I suggest we instead do something like this:

# generate element code + set of used geometry terms + set of used signs
element_code, geo_set, sign_set = __generate_element_tensor()

sign_code = __generate_signs(sign_set)

# generate geometry code + set of used coefficients + set of jacobi terms
geo_code, coeff_set, jacobi_set = __generate_geometry_tensors(geo_set)

code = __generate_jacobian(jacobi_set)
code += __generate_coefficients(coeff_set)
code += geo_code + sign_code + element_code

with this approach we should be able to speed up code generation (at the expense
of memory consumption, which will be small I think?)

or is the above not possible because of something that I missed?

Kristian

---

From: Anders Logg <[email-masked]>
Date: Fri, 15 Jun 2007 16:16:30 +0200

> or is the above not possible because of something that I missed?

We did something like this before (keeping track of which variables
are used when we generate the code). I added the remove_unused() as a
postprocessing step for simplicity.

I have no objections to fixing this, but perhaps we can wait until
after the release? (So we don't break anything.)

Another thing to look at would be if it's possible to optimize the
remove_unused() function.

/Anders

---

From: Kristian Oelgaard <[email-masked]>
Date: Fri, 15 Jun 2007 16:29:12 +0200

> after the release? (So we don't break anything.)

Yes, we should definitely wait until after the release.

> remove_unused() function.

I think that remove_unused() is OK as long as we don't use it for the
tabulate_tensor() code. For the other parts of the formatting where we use it,
it is quite handy.

Kristian

> /Anders
> _______________________________________________
> FFC-dev mailing list
> [email-masked]
> http://www.fenics.org/mailman/listinfo/ffc-dev
>

---

From: Anders Logg <[email-masked]>
Date: Sat, 16 Jun 2007 00:29:33 +0200

> tabulate_tensor() code. For the other parts of the formatting where we use it,

ok, let's try that.

/Anders