CIMPL Performance Library Home | Baris Sumengen's Home | Discussion Forum

CIMPL Numerical Performance Library

CIMPL 1.0 Beta is released - Jan 20, 2005

Jan 24: DOCUMENTATION IS CURRENTLY BEING WRITTEN AND UPDATED. Please be patient.

Download CIMPL 1.0 beta here

Browse the source code reference

Installation Instructions

Note: Web page for the old version of CIMPL (CIMPL 0.1) can be accessed at http://barissumengen.com/cimpl/0.1/
But CIMPL 1.0 brings at least 10 times more features and fixes several important bugs.

Introduction to CIMPL
Main reason why I started developing CIMPL is that I wasn't able to find anything available including commercial offerings. I needed a matrix library with little or zero preformance overhead but at the same time extremely easy to use, e.g. like Matlab. I don't want to spend two days to figure out what a library is about. So, I developed cimpl with the performance, flexibility, interoperability with old libraries (e.g. Fortran-based), Matlab compatibility and ease of use and installation in mind. Unlike other attempts, CIMPL not necessarily isolates internals from the users. In numerical computing, I believe developers should have the option to play with internals of matrices (e.g. pointers) if they really want to.

For version 1.0, my main goal has been to get it right in terms of the design of matrices and vectors. So I avoided programming issues such as exception handling, or use of interfaces for future extendibility. These issues will be handled in future versions of CIMPL. My principle is that I won't introduce features if they create a performance bottleneck. So don't be worried about performance.

One of the goals for CIMPL was compatibility and interoperability with Matlab. Many researchers are familiar with Matlab coding and Matlab functions. Matlab is commonly used for prototyping because it is interpreted and has comprehensive visualization tools. CIMPL includes Matlab-like functionality, e.g. functions Find() or MeshGrid() behaves exactly the same way as the corresponding Matlab functions. Also you can export CIMPL matrices as *.m files and load them to Matlab and visualize them easily.

CIMPL is not limited to Vector and Matrix data structures and comes with a wide range of functions. Linear algebra functions for eigenvalues, svd, least squares problems, etc., read/write image formats, vectorized high-performance functions ranging from Sin() to Erfc(), a large number of matlab functions has equivalents in CIMPL, Fourier transform and convolution with all kinds of options including border types (symmetric, circular, etc.) and more.

Quick Links:
- OS and Compiler support
- Code Examples and Demo
- Vectorized functions (based on Intel MKL)
- Matlab compatible functionality and matrix data export from CIMPL to Matlab.
- Vector and Matrix operations (e.g. multiplication) through Intel optimized BLAS.
- Linear Algebra through Intel optimized LAPACK
- Image Read/Write by utilizing ImageMagick.
- 1-D and 2-D Discrete Fourier Transform (DFT, FFT) and 1-D and 2-D FFT-based flexible convolution (compatible with matlab options).

Data Structures - An Overview

Each of these data structures uses C++ templates such that any type of data can be stored in them. The term data will be used here to represent the contents of these containers. For vectors, matrices and arrays, data is simply a single dimensional C++ array.

  1. Vector: One dimensional data structure.
  2. Matrix: Two dimensional data structure. Data is stored in a one dimensional C++ array in a column major order.
  3. MatrixList: An array of matrices of the same size. An example use is representing color images as a length 3 MatrixList.
  4. Array: Multi-dimensional data structure (upto 10 dimensions: this restriction will be removed in the future). Array data structure is still evolving so avoid using it unless necessary. Use Vector, Matrix or MatrixList if they can do the job.
  5. SparseMatrix: Dynamically allocated two dimensional matrix. Elements with value 0 are not stored to save storage space. Uses a 2-D linked list underneath, e.g, each column and row are linked lists and an element (x,y) can be reached by either traversing a column or a row. This way, a column or a row from a sparse matrix can be extracted easily. Currently only simple element access is supported. More advanced operations such as matrix multiplication will be added in a future release.

More documentation will be available soon!