[Liboil] Gauss-Seidel optimisation

Mattijs Janssens m.janssens at opencfd.co.uk
Wed Jan 2 11:26:07 PST 2008


Hello,

one of my inner loops does a Gauss-Seidel iteration using indirect addressing. 
Is it possible to use liboil to optimise this?

I have been thinking about using oil_permute_xxx to collect the data in a 
straight array before doing the calculation but this of course then becomes 
point-jacobi instead.

My current algorithm loops over all the cells (=columns). Per cell it looks up 
the neighbouring cells and corresponding face (as start and end index into an 
addressing array; compact row storage). The two bottlenecks are the indirect 
addressing in the 'accumulation' and 'distribution' phase.

- accumulation: get a coefficient from a face and a value from a cell 
(indirect addressing) and multiply. Store in local variable.

- distribution: get a coefficient from a face, multiply with local variable 
and store in cell (indirect addressing).

Below is the actual code:

for (register label cellI=0; cellI<nCells; cellI++)
{
    // Start and end of this row
    fStart = fEnd;
    fEnd = ownStartPtr[cellI + 1];

    // Get the accumulated neighbour side
    curPsi = bPrimePtr[cellI];

    // Accumulate the owner product side
    for (register label curFace=fStart; curFace<fEnd; curFace++)
    {
        curPsi -= upperPtr[curFace]*psiPtr[uPtr[curFace]];
    }

    // Finish current psi
    curPsi /= diagPtr[cellI];

    // Distribute the neighbour side using current psi
    for (register label curFace=fStart; curFace<fEnd; curFace++)
    {
        bPrimePtr[uPtr[curFace]] -= lowerPtr[curFace]*curPsi;
    }

    psiPtr[cellI] = curPsi;
}


-- 

Mattijs Janssens

OpenCFD Ltd.
9 Albert Road,
Caversham,
Reading RG4 7AN.
Tel: +44 (0)118 9471030
Email: M.Janssens at OpenCFD.co.uk
URL: http://www.OpenCFD.co.uk


More information about the Liboil mailing list