Every so often people come up to us and ask: "Aren't you guys concerned that compilers will put you of business?" or "Can't a compiler do the same thing that you guys are doing?". Fortunately for us and a lot of the people in high-performance computing the answer is simply "NO".  While compilers have made massive progress in the last two decades, they are nowhere near the point of putting us and many other HPC programmers out of business. Compilers are still a one-size-fits-all solution that need to deal with any and all input, whereas HPC programmers can be thought of as designer-fitted solution.

Application expertise brings a lot to the table that a compiler cannot compete with:
<ul>
	<li>Memory access patterns - while some applications such as matrix applications have regular and simple memory access patterns, other applications such as graph algorithm used for social network analysis have random memory access patterns that a compiler cannot optimize.</li>
	<li>Data familiarity - a basic understanding of the data set which can help in decide on different optimizations 1) loop unrolling, 2) SIMD usage, 3) number of threads that should be used, 4) memory footprint and more.</li>
	<li>Load balancing - APIs such as OpenMP offer directives that allow the program designer to decide on the parallel granularity and the type of scheduler to use. The static scheduler offers a straightforward and simple partitioning of the loop across the threads - this does not ensure load-balancing as each iteration of the thread may require a different amount of work. The dynamic scheduler on the other hand allows finer grain partitioning of the work; in practice this scheduler has limited scalability due the nature of multiple threads trying to access the same work queue.</li>
	<li>The increase in the number of architectures has increased the number of programming languages and models. Each system requires a different set of optimizations and the there simply are not enough compiler people to support all the necessary changes to achieve maximal system utilization. Further, application expertise can help decide the right system for the problem at hand.</li>
</ul>
By no means is the purpose of this blog is not to reduce the significance or impact that compilers have had on the computing. Rather this blog focuses on the reason that compilers simply cannot offer a high enough level of system utilization that domain expertise does offer! ArrayFire was designed by people with domain expertise. So if you are looking for a high performing OpenCL package, ArrayFire is your solution!

&nbsp;

&nbsp;

&nbsp;