Skip to main content

Scilab matrix norm optimization

I had used Scilab for learning Digital Image Processing. It is a good open source alternative to Matlab. Although it has a good foundation, it was very clear that it was improvement was still possible.

In a recent image processing workshop, I learnt that the Scilab community had open sourced the source code on GitHub.

Keeping in mind that the software is continually evolving, I knew I could put my optimization skills to good use.

So, I dug into the code-base and found a few optimizable programs. So, I decided to inculcate parallelism into matrix norm calculation program, which is quite simple yet used by many other subprograms and external function calls.

https://github.com/opencollab/scilab/blob/master/scilab/modules/linear_algebra/src/c/norm.c

There were many potential areas for optimization:
  • Elimination of redundant comparisons
  • Use else if construct to remove redundant checks
  • Remove floating point equality comparison!
  • Embarrassingly parallel/perfectly parallel for loop with reductions
  • Usage of min,max reduction of for loops, supported from openMP 3.1 onwards
  • Move iterative invariants outside loops and reuse variables
  • Factor out the FREE function from conditional statements (Scilab's version of the C memory d function free)
  • Intermediate variables to store repeated value computations
The following link leads to the optimized version of norm:

https://github.com/varun-manjunath/scilab/blob/master/scilab/modules/linear_algebra/src/c/norm.c


I'll pull request the Scilab repository soon.
I've issued a pull request on the Scilab repository!

A floating point comparison can really become a harbinger of erroneous code. It will definitely not be portable due to the hardware dependability of precision and representation of floating point numbers.

http://stackoverflow.com/questions/19837576/comparing-floating-point-number-to-zero

I've also extensively used OpenMP reductions, especially with the + operator. The min reduction has also been used. Here is a link explaining min and max reductions with for loops.

http://www.techdarting.com/2013/06/openmp-min-max-reduction-code.html

There were some instances of code where I was perplexed with it's utility. There were idempotent equality comparisons and trivial integral divisions. I have left them unchanged, in the feeling that there is some fine level detail not visible with a simple inspection. I will update this point as soon as I understand what those pieces of code are meant for! Please comment to this post in case you know what is happening.  :)

The optimized code also decreased in size, owing to the elimination of unnecessary conditional statements and redundant expression calculations!

Comments