Coprocessors: The progression of the offloading of processing requirements.
A coprocessor is an additional processor that augments the Central Processing Unit (CPU). In some cases, coprocessors provide additional functionality not offered by the primary processor. In other cases, the coprocessor only offloads processor intensive tasks, from the primary processor, in order to increase performance. The use of a coprocessor increases system performance by freeing the primary processor to perform other functions. In addition, a coprocessor can save money by allowing customers to purchase only the specialized processors that are needed. This reduces the cost of the primary CPU because unneeded processing power, embedded in the primary processors, will not need to exist.
When any processing operation is moved to a unit other than the main CPU, the secondary until is known as a coprocessor. Coprocessors can be found in a variety of implementations. A network card may include a specialized coprocessor to handle networking operations. In addition, specialized SSL encryption coprocessors offload the public key encryption algorithms involved in SSL transaction.
While many types of coprocessors exist, this paper will discuss the history of two important coprocessors, the graphics coprocessor and the floating-point math coprocessor. It will begin with a discussion of the history and progress of the graphics coprocessor. That will be followed by a discussion of the floating-point math coprocessor that was prevalent throughout the 1980s and 1990s.
A graphics coprocessor supplements the primary CPU by providing graphic support. These processors are very efficient at processing the complex algorithms used to manipulate 3D graphics. These specialized processors contain microchips that are specially built to perform floating point mathematical operations that are needed for graphics rendering. In some cases, this graphic processor is on a video card that directly interfaces with the monitor. In other cases, the graphic processor is actually part of the system motherboard. A graphics processor on an independent video card is usually more powerful than an integrated graphics processing unit.
One of the earliest graphic coprocessors was the Television Interface Adapter (TIA), which was the graphics chip used the popular Atari 2600 gaming system in the mid 1970’s. Atari was one of the first mass produced game systems, and one of the first ‘computers’ in widespread use. At the time, it was at the forefront of computer graphics. The TIA chip was responsible for generating the video image that the game console displayed on a television screen. During the 1970s, the cost of RAM was very high and, as a result, this early chip had no video memory. This chip could only generate one line of video at a time, and this video was directly created from data in registers.
Eventually, Atari replaced the TIA chip with the Custom Television Interface Adapter (CTIA), which is a collection of multiple TIA chips. This chip worked with a second graphics chip called the Alpha-Numeric Television Interface Controller (ANTIC). The ANTIC chip processed high level graphic instructions and translated them to simpler instructions for the CTIA processor. The CTIA processor acted has the interface with the monitor (television) and would directly control the display.
By the end of the 1970’s, Atari had replaced the CTIA chip with the GTIA chip named after its creator George McLeod (George's Television Interface Adapter). By this time, the chip, being marketed has a microprocessor, had a small about of RAM available for video operations. This was the last significant graphics advance by Atari, and soon the gaming company became irrelevant as other companies began to dominate the market.
By the mid 1980s IBM was in on the graphics games and had created the Professional Graphics Controller. This was a 3D graphic coprocessor when there were very few 3D graphic needs. This slow coprocessor had very few practical applications and never caught on with the public. Nevertheless, this was the first general purpose graphics coprocessors and it deserves to be mentioned in any historical overview.
About the same time, Commodore released the Amiga with what was called a video blitter. This blitter was actually a graphics coprocessor that could process 2D graphics. This was the first major product that offloaded almost all of the video generation to a coprocessor. This video blitter was a highly parallel memory transfer and logic operation unit. It contained modes of operation, copy block of memory, filling blocks, and line drawing. These three modes, used in conjunction, allow the chip to draw flat- shaded, polygons at a rate which was very quick for the time (1).
The 1990s saw a big change in graphic processors. In 1991 a 2D graphics chip known as S3 86C911 was introduced by S3 graphics. This graphics coprocessor was specifically designed for use with Graphical User Interfaces (GUIs). It contained support common GUI operations such as moving or resizing windows. After a few years, the market was flooded with imitators but soon the need for a 2D graphic processor faded.
Years earlier, IBM had introduced the Professional Graphics Controller but it was slow and ahead of its time. By the mid 1990’s, 3D graphics were becoming common in computers and in gaming consoles. In addition, OpenGL became prominent as a graphics API. Shortly thereafter, Direct X gained prominence on Windows platform. This led to a new generation of graphic coprocessors that would incorporate the 3D rendering pipeline instead of only handling the simpler rasterizing process.
In 2006, Ageia released the PhysX card which includes a physics coprocessor (2). This specialized coprocessor takes the concept of a graphics coprocessor one step further. The PhysX coprocessor handles the complicated physics functions needed for advanced graphic displays. This is actually a coprocessor that offloads functionality from a chip which is itself a coprocessor.
As the 2000 decade progressed the graphic coprocessors added shading and texture mapping to their abilities. Eventually these powerful graphic processors began to consume more energy, and produce more heat, than CPU. As a result, a new field known as General Purpose Computing on GPU (GPGPU) is emerging. This is a technique of using the graphics coprocessor to handle non-graphic related computations (3). In this capacity, the GPU can be used as a powerful and economic super-computer performing complex parallel programming operations.
Graphics processing started as a necessary burden on the CPU. This lead to stand alone, proprietary graphic coprocessors that could offload a small portion of the interaction with output devices. These successful advances, led to the offloading of more and more graphics work, such as rastering and rendering. Eventually, open-standards, third-party graphics processors replaced the earlier proprietary models. These advances eventually lead to robust graphic coprocessors are can actually assist the CPU in non-graphic related calculations.
Floating Point Coprocessor
A floating point number is an approximation of an actual number. These are usually numbers that are too large, or too small, to be represented as integers. A floating point number uses a “sliding window” of precision in order to easily represent very large or very small numbers (4). When a floating-point operation is required, there are three ways to handle it: a floating point emulator, and add-on floating-point unit, or an integrated floating-point unit. A floating-point emulator is simply a library that handles the floating-point arithmetic using the primary CPU. The other two options use floating-point coprocessors, also known as a math coprocessor, in order to offload the floating-point work from the main CPU and increase overall system performance. An add-on floating-point unit is a separate chip that augments the primary CPU. The separate chip is often on an independent graphics card that can be optionally attached to the computer. An integrated floating-point unit is tightly integrated with the primary CPU and is usually physically attached to the CPU.
In the 1980’s, most PCs had a floating point coprocessor, that was separate from the main CPU. At the end of the 1980’s, the 80486 chip was introduced with floating-point processor integration with the CPU. For more price sensitive customers, the 80486sx chip was release that had no floating-point coprocessor. This was actually a marketing gimmick, and the 80486sx was the same chip with the floating-point coprocessor disabled (5).
In addition to these traditional floating-point coprocessors, there are also add-on floating-point coprocessors that provide proprietary floating-point arithmetic capability. These chips are frequently processor independent and have their own programming requirements. In many cases, these coprocessors come with a custom IDE and the developer codes directly to the chip.
As microprocessor architecture has progressed, the cost of integrating the floating-point arithmetic operations in the main CPU decreased. In addition, the substantial CPU speed increases over the past several years have made integrated floating-point coprocessors difficult to implement. As a result, floating-point coprocessors are now rarely found in desktop computers. The floating point coprocessor is now a rare piece of technology reserved for the special needs of high-end computing.
Coprocessors serve an important need. They increase performance by offloading processing from the primary processor to any number of secondary coprocessors. In addition, they allow increased general hardware flexibility and provide optimizations for complex processing algorithms. Coprocessors can work as a bridge handling important, processor intensive tasks while we wait for technical advances. This can be seen in the progression of the floating-point coprocessor, from inception, to perfect, to near obsolesce. In other cases, a coprocessor such as a graphics processor can also grow to provide new functionality eclipsing that which can be provided by even the fast CPUs.
As CPU speed increases, multi-cores become commonplace, and memory speeds improve the overall system performance improves. In some cases, these advances in system performance may overcome the need for coprocessors. However, coprocessors will continue to improve applications that push the edge of technology limits.