Tuesday, August 29, 2006

G-15 Memory Model

[This is part of a series of expository, rather than anecdotal, notes, but it provides background for my discussion of the Bendix G-15 architecture. Skip it if you're interested only in my stories.]

As far as the programmer was concerned, the G-15's memory of 2,183 (29-bit) words [1] was organized into
  • 20 "long lines" numbered from 0 to 19, each containing 108 words.
  • 4 "short lines" numbered from 20 to 23, each containing 4 words.
  • 3 double-precision registers numbered from 24 to 26, each containing 2 words.
  • 1 single-precision register, numbered 28.

A memory address consisted of a line number and a word time (from 0 to 107), e.g., 5:17 denoted line 5, word 17. All word times were modulo the length (in words) of the line addressed. E.g., 21:17 was the same as 21:1.

The variety of line lengths enabled a trade-off between storage capacity and access time, with a modest amount of hardware. [2] A long line contained 108 words, but its average access time was half a drum revolution (14.5 msec). [3] A short line contained only 4 words, but its average access time was just 2 word times (0.5 msec), so it could be used as a programmer-managed cache. The single-precision accumulator had to be available at every word time, so that operands could be accessed from, and results stored to, every location in memory.

Optimum programming required not only placing frequently-used values in fast memory, but ensuring that values and instructions in long lines were located to minimize the delay between reading an instruction and reading its operand, and between completing the execution of an instruction and reading the next instruction. Each of these delays could be anything from 0 to 107 word times. We programmers firmly believed that we could do a better job of choosing locations than any automatic system could, which is why systems like POGO (the Program Optimizer for G-15 Operation) [4] weren't commonly used.

Some memory lines had additional properties:

  • Instructions could be executed from lines 0 to 5, 19, 23, and 28.
  • Lines 19 and 23 were also used for buffering by the I/O system.
  • Lines 24 and 25 were used for shifting, multiplication, and division.
  • Line 26 was the double-precision accumulator, also used for multiplication and division.
  • Line 28 was the single-precision accumulator.

[1] There were at least 112 words of drum memory that were not ordinarily accessible to the programmer.
[2] Compare the G-15's 30 pairs of drum read-write heads with the contemporary IBM 650's 119 or 219 pairs (for 1,000 or 2,000 words of memory, respectively), giving an average access time of 2.4 msec.
[3] This was a "logical" drum revolution. Each memory line was recirculating and the time between writing a bit and reading it again depended on the physical distance between the read and write heads. But it did not mattter to programmers how rapidly the physical drum rotated.
[4] POGO was called a "compiler," but was actually more like a very simple assembler.