Even with today’s software development tools such as cross-compilers, porting an application from one platform to another is a significant challenge. There are a variety of adaptations which must occur to make the application even able to run, let alone perform as well as it had in its native environment. These include:
- The Operating System: In most cases, the new processor may run a different operating system than was utilized in the native compute environment. This means that the application will have to be modified to utilize different system calls.
- Word Size and Bit Ordering: Then there is the matter of modifying the application to the specifics of the processor. Issues such as word size (64-bit vs 32-bit, for example) and the “endianness” of the processor (X86 processors are little endian, for instance).
- Other Significant Differences: Finally, the number of cores, the variations in how context switching occurs, threading model differences, and timing differences within both the processor platform and the operating system all make things challenging.
As a start, let’s take the simple example of porting an application from Windows running on X86 to an ARM server running Linux. While ARM processors are “little endian” (like X86 processors) and the threading models are similar, there are a number of specialized commands in the X86 that are not present in the ARM processor (hence the name “Advanced Reduced Instruction Set Computing Machine). These may “bubble up” to the application level as differences in execution timing. Finally, the differences in the graphics capabilities of Windows versus Linux can result in the need to recode graphical user interfaces (GUIs) to ensure graphical performance.
These are but a few of the differences that can make porting applications difficult. For a software development company, they must weigh the costs of adapting an application to these differences, versus the size of the new market opportunities that are created by porting the application. Our next blog will look at ways of simplifying the porting of applications from X86 platforms to the computational storage platform.