At MonkeyProof Solutions, we think of software as an asset, not a liability. A means to make your innovation work.
We address today's Technical Computing challenges by domain-driven designs, tackling complexity right at the heart, with software.
Modularity at all levels, from relational databases to business-logic and GUI's, ensures high degrees of flexibility,
consistency, and scalability.
We speak physics, math, and a multitude of programming languages. That's the strength of our team - as well as our solutions.
Design & Programming Languages
We put strong emphasis on a thorough design-phase, prior to any development project. A suitable data model combines performance with flexibility and extensibility. The domain-specific layer is designed on top, independent and focused, comprising of carefully chosen object-oriented abstractions of the business logic (UML). Where applicable, the whole design is wrapped in our (GUI) Application Framework. We are proficient in a multitude of Technical Computing languages: we can develop applications in one language entirely, or interface with (legacy) components in another. For instance, we developed MATLAB applications hosting FORTRAN or Python components, or compiled C/C++ parts. The result? Solutions that typically stick around for a long time. Updated and modified along the way, but relevant nonetheless, even after many years. Get in touch. We look forward to discuss your challenges.
Computational performance is becoming increasingly important. Prohibitively long run-times are a serious concern, both in the development and production phase. At the start, quick iterations help maturing an idea, and are vital to converge to a sound implementation during the validation phase. In production, poor performance may introduce undesired latencies and block use-cases such as batch runs, often used for optimization efforts. Solutions are available to significantly reduce calculation times. We have significant experience with performance optimization, most notably - but not exclusively - in MATLAB & Python, and can assist you at any point in the software's life-cycle.
Depending on your application, parallel computing can be a powerful option to reduce run-times. Analyses are split up in batches and distributed over the available processors. This can be realized locally, using the cores available on a desktop machine, or on a computer cluster. In addition, you can schedule sets of analyses to run overnight. This automation feature is not unique to parallel computing, it is however increasingly powerful, when used in a multi-core setting. We are keen to share our experience with parallel computing in MATLAB and Python with you.
GPU | CUDA Programming
Multi-core machines and hyper-threading technology have enabled engineers and financial analysts to speed up computationally intensive applications in a variety of disciplines. Today, another type of hardware promises even higher computational performance: the graphics processing unit (GPU). Originally used to accelerate graphics rendering, GPUs are increasingly applied to scientific calculations. Unlike a traditional CPU, which includes no more than a handful of cores, a GPU has a massively parallel array of integer and floating-point processors, as well as dedicated, high-speed memory. A typical GPU comprises hundreds of these smaller processors. We can help out, and identify the performance gains that GPU and CUDA programming can bring to your applications.
Code Profiling and Optimization
Software developers are typically focused on translating methodologies into software, and rightfully so. Converting and validating math
is a challenge of its own. From our experience, it appears that the resulting code-base may produce the correct results, it is however
not optimized for calculation performance. In most cases, dedicated profiling and optimization of the code yields significant performance benefits,
without compromising the quality of the results.
Optimal performance is typically achieved by pursuing both code profiling and parallel and/or GPU computing in one go. Lessons learned can be reused in other code, propagating the benefits in your entire product portfolio.
We have learned that Parallel Computing and GPU/CUDA Programming on itself are no holy grails. Performance is a very application-specific software aspect, not eligible for a 'one size fits all' approach. Large vectors and matrices may be a bottleneck, but so are specific algorithms and mathematical operations. Each challenge calls for a tailored solution. We therefore approach each case individually:
- Establish performance requirements, based on your use-cases
- Identify calculation speed bottlenecks
- Identify suitable acceleration options
- Where required, refactoring or C-compilation (MEX implementation) of bottleneck code
- Implement and benchmark performance improvements
Version control is indispensable. Working simultaneously on a single code-base, keeping track of model evolution, being able to release,
keeping oversight of versions and branches. All facilitated by version control. Broadly, two types can be defined: centralized, like Subversion.
And distributed, like Github. We have experience with both and can integrate these (open source) systems within your workflow or even within
your applications. Each type has its specific strengths, from our experience it appears that a centralized system (Subversion) is sufficient for
development and distribution of most models and technical computing software.
To achieve optimal governance of your models and software, it is advised to integrate an issue tracking system as well: allowing you to link issue and enhancement ID's to a specific commit in version control. We can assist with selecting and implementing a suitable system.
Contact us at MonkeyProof Solutions, we look forward to get to know you and to discuss your challenges.