← Back to team overview

ffc team mailing list archive

Re: [Branch ~ffc-core/ffc/main] Rev 1684: Change code generation for evaluate_basis and

 

On 09/12/11 20:00, Marie E. Rognes wrote:
On 09/12/11 19:54, Garth N. Wells wrote:
On 12 September 2011 18:49, Marie E. Rognes<meg@xxxxxxxxx>  wrote:
On 09/12/11 19:40, Garth N. Wells wrote:
Which compiler options did you use when evaluating the speed up?

Tested Extrapolation.h with vanilla dolfin (which is dominated by
evaluate_basis calls). No additional compiler options set.

What are the default compiler options?

'-g' for plain JIT, which is dead slow.  You should test with at least:

     parameters["form_compiler"]["cpp_optimize"] = True

in the Python code. This will use '-O2'.


Ok, thanks -- I'll take a closer look.


Take a look at the attached results in old_evaluate_basis.txt (results with "old" FFC), and new_evaluate_basis.txt (results with "new" FFC) from running the attached
test_evaluate_basis.py.

Acceptable?

--
Marie




OLD:

--------------------------------------------------------------------------------
degree =  1
time, 2d, cpp_optimize = False:  0.120431900024
time, 2d, cpp_optimize = True:   0.114153146744
time, 3d, cpp_optimize = False:  0.198750019073
time, 3d, cpp_optimize = True:   0.162876844406

--------------------------------------------------------------------------------
degree =  2
time, 2d, cpp_optimize = False:  0.300379991531
time, 2d, cpp_optimize = True:   0.233283996582
time, 3d, cpp_optimize = False:  0.762866973877
time, 3d, cpp_optimize = True:   0.431936979294

--------------------------------------------------------------------------------
degree =  3
time, 2d, cpp_optimize = False:  0.576278924942
time, 2d, cpp_optimize = True:   0.411046981812
time, 3d, cpp_optimize = False:  1.96871781349
time, 3d, cpp_optimize = True:   1.07180404663

--------------------------------------------------------------------------------
degree =  4
time, 2d, cpp_optimize = False:  0.988406181335
time, 2d, cpp_optimize = True:   0.682631015778
time, 3d, cpp_optimize = False:  4.75827598572
time, 3d, cpp_optimize = True:   2.35853600502

--------------------------------------------------------------------------------
degree =  5
time, 2d, cpp_optimize = False:  1.62303113937
time, 2d, cpp_optimize = True:   1.00284218788
time, 3d, cpp_optimize = False:  10.7842290401
time, 3d, cpp_optimize = True:   4.76599907875

NEW:

--------------------------------------------------------------------------------
degree =  1
time, 2d, cpp_optimize = False:  0.103919029236
time, 2d, cpp_optimize = True:   0.107428073883
time, 3d, cpp_optimize = False:  0.161116838455
time, 3d, cpp_optimize = True:   0.151404857635

--------------------------------------------------------------------------------
degree =  2
time, 2d, cpp_optimize = False:  0.22599697113
time, 2d, cpp_optimize = True:   0.219713926315
time, 3d, cpp_optimize = False:  0.450500011444
time, 3d, cpp_optimize = True:   0.404354095459

--------------------------------------------------------------------------------
degree =  3
time, 2d, cpp_optimize = False:  0.392661809921
time, 2d, cpp_optimize = True:   0.369643211365
time, 3d, cpp_optimize = False:  0.96449303627
time, 3d, cpp_optimize = True:   0.891642093658

--------------------------------------------------------------------------------
degree =  4
time, 2d, cpp_optimize = False:  0.634053945541
time, 2d, cpp_optimize = True:   0.559627056122
time, 3d, cpp_optimize = False:  1.90867900848
time, 3d, cpp_optimize = True:   1.54476189613

--------------------------------------------------------------------------------
degree =  5
time, 2d, cpp_optimize = False:  0.954979896545
time, 2d, cpp_optimize = True:   0.803352117538
time, 3d, cpp_optimize = False:  3.52839899063
time, 3d, cpp_optimize = True:   2.71618795395
from dolfin import *
import numpy
import time

def run(dim, N, num_repeats, optimize, degree):

    parameters["form_compiler"]["cpp_optimize"] = optimize

    if dim == 2:
        mesh = UnitSquare(1, 1)
    else:
        mesh = UnitCube(1, 1, 1)

    cell = Cell(mesh, 1)
    V = FunctionSpace(mesh, "CG", degree)
    element = V.element()

    m = cell.midpoint()
    x = numpy.array([m[i] for i in range(dim)], 'd')

    n = element.space_dimension()
    d = element.value_dimension(0)
    values = numpy.zeros((n, d), dtype='d')

    repeats = range(num_repeats)
    basis_functions = range(n)

    t0 = time.time()
    for k in repeats:
        for i in basis_functions:
            element.evaluate_basis(i, values[i,:], x, cell)
    t1 = time.time()

    return (t1 - t0)


repeats = 10000
for degree in [1, 2, 3, 4, 5]:

    print "-"*80
    print "degree = ", degree
    print "time, 2d, cpp_optimize = False: ", run(2, 1, repeats, False, degree)
    print "time, 2d, cpp_optimize = True:  ", run(2, 1, repeats, True, degree)
    print "time, 3d, cpp_optimize = False: ", run(3, 1, repeats, False, degree)
    print "time, 3d, cpp_optimize = True:  ", run(3, 1, repeats, True, degree)
    print

Follow ups

References