We quickly grasp domain-specific concepts and gladly jump in to capture the math and cast it into software. We speak physics, math, and a multitude of programming languages like Python, Julia, MATLAB, and C++. Scientific coding is the strength of our team – and our solutions.
Our involvement often starts right at the ideation phase. We gladly help with specifications and assessments of math and computational approach. The upside of our early involvement: we put designs to the test in proofs-of-concept, to tackle the hard things first. That pays off, resulting in performing solutions, proper maintainability, and manageable project cost.
We keep you closely involved with regular intermediate deliveries and feedback-sessions. Or we blend in onsite to work in lockstep with your team. Where possible, we stay close to your domain specialists, making best use of their expertise. Your autonomy is our guiding principle: we want you to be succesfully independent, capable of owning scientific software with confidence. We aim for longer-term relationships based on added value and appreciation, instead of dependencies and vendor lock-ins.
Partner with us, to build your computational solutions in time and within budget. Check our user stories to learn more. Since our founding in 2008, we gained proven scientific coding experience in the following industries:
High-tech, Automotive, Aerospace
Semicon, Automotive, Machinery, Mechatronics
Finance, Insurance, Utilities
Banking, Insurance, Regulatory
Energy, Maritime, Offshore
Shipping, Dredging, MetOcean, Windfarms, Oil & gas
Our developers are distinguished by their scientific backgrounds. We understand abstractions, complex analysis, and computational challenges. Our software skills enable us to translate concepts into efficient software solutions.
Math and languages
Scientific software design is a craft. Our developers are familiar with a wide range of math algorithms and their software implementations, partially developed by ourselves. We keep up with developments and regularly benchmark new methodologies and languages. Currently, we are evaluating Julia, an upcoming programming language that is gradually finding its way in the world of scientific software and beyond.
Understandably, implementations typically start from the functional point of view: making sure all computations are covered and interact as they are supposed to. Starting out with small and idealized data samples, to achieve first conceptual results. At a later stage, real data is fed into the software, typically exposing performance and memory issues. We learned the art of performance-aware programming, to optimize resource usage from the start.
Properly coded apps not only perform well, they are also easy to maintain and support. Not as obvious as it may sound, we learned from experience. To ensure quality, we work with carefully crafted designs and uphold coding-standards, so your developers always know what to expect when inheriting and adopting our code. For MATLAB, we developed our own code checker (CC4M): professionalize your work and become compliant with ease.
We profile your exisiting code to identify time-consuming hotspots or spikes in memory loading. We start out with typical performance analysis tools to secure quick wins. From there, we dive deeper into the computational code and data-usage to isolate expensive constructs. Our experience helps out: we assessed a wide variety of calculation engines in multiple languages. This offers a headstart and rapid insight in the challenges and opportunities.
Reducing memory loading
Memory loading is often reduced significantly by trimming down ingested data to the must-haves. Selecting the most optimal data structures is the obvious next step. Data size and shape: both matter. In addition, targeted refactoring of algorithms reduces memory loading as well. Our versatile experience is always of help: we optimized memory usage, for larger computational clusters and hardware-limited embedded applications alike. The required creativity resulted in a formidable toolkit that inspires us every time.
Typically, significant performance gains are achieved by thoroughly revisiting computational algorithms, math representations and (local) data loading. Where possible, we seek to use standardized and optimized math libraries, replacing less optimal native implementations. Smarter math and smarter code: it offers tangible results. In addition, we assess the underlying hardware that runs it all: to mitigate the limitations and to leverage the opportunities.
Once algorithms are optimized, it is time to assess workload distribution. Parallel computing is a powerful option to reduce runtime, still increasingly so, as processors are still becoming progressively efficient in matrix operations and multicore task handling. Smart parallelisation pays of, although it requires some refactoring. For very large computational loads, dedicated (cloud) clusters come into the picture. Together, we identify the optimal parallel computation strategy.
GPU | CUDA Programming
The graphics processing unit (GPU) delivers even higher parallel computation performance. Originally used to accelerate graphics rendering, GPUs are increasingly used for scientific calculations. Unlike traditional CPUs with only a handful of cores, GPUs boast large arrays of integer and floating-point processors, as well as dedicated high-speed memory. We help you leveraging the performance gains of GPU and CUDA programming.
Optimizing software requires strict focus on upholding validity of numerical results. Core functionalities must remain unchanged, making continuous back-to-back testing and validation integral part of the work. This also requires proper understanding of domain and specific purpose of the computational cores. This typically requires a combined effort, we gladly engage with your specialists to optimize your code with confidence.