The Memory System of a High-Performance Personal Computerby Douglas W. Clark1, Butler W. Lampson, and Kenneth A. PierJanuary 1981ABSTRACTThe memory system of the Dorado, a compact high-performance personal computer, hasvery high I/O bandwidth, a large paged virtual memory, a cache, and heavily pipelinedcontrol; this paper discusses all of these in detail. Relatively low-speed I/O devices transfersingle words to or from the cache; fast devices, such as a color video display, transferdirectly to or from main storage while the processor uses the cache. Virtual addresses areused in the cache and for all I/O transfers. The memory is controlled by a seven-stagepipeline, which can deliver a peak main-storage bandwidth of 530 million bits per second toservice fast I/O devices and cache misses. Interesting problems of synchronization andscheduling in this pipeline are discussed. The paper concludes with some performancemeasurements that show, among other things, that the cache hit rate is over 99 percent.A revised version of this paper will appear in IEEE Transactions on Computers.CR CATEGORIES6.34, 6.21.KEY WORDS AND PHRASESbandwidth, cache, latency, memory, pipeline, scheduling, storage, synchronization, virtualmemory.1. Present address: Digital Equipment Corporation, Tewksbury, Mass. 01876.c Copyright 1981 by Xerox Corporation.XEROXPALO ALTO RESEARCH CENTER3333 Coyote Hill Road / Palo Alto / California 94304MmpJ"CqXD1rCq(=* 4s1tH0utut =..utut- 2+C*utut6( H&utut ;%w !*# K /vwtS;\,} z 9 }z38TH{z6C5L\3M2D10 X/<T,W*,.) [' +&&;&$}8{z{z" {z{zE!u: }z.mDn}XCz#{z{z {zO;){zB{z{z3 2& Q /2 &7 | J =t C Nl?Yd+ SHdSEC. 1INTRODUCTION53<==1;\,{z{z%9={z{z8TM63,5L=3 ){z{z$2D7#0{z{zL/<M,R*}z7{z{z$) Z'G&b$}?"/} z!uCR,1BW J :{z#?2.2*4*`#{z/" 0 #}XzG t O6l@-/dT SHdE$$%$ $$$ $$ $rW$1sV$9%$1sy$1s$=$= y$KA$= V$Vr VW 3sA &WW$=;tk r:   N   s9$ ^$9 :]$ :$] :$] :$ ^$9 sr$ s$ ^$9 :@$ :$] GV G G 2 G:k s$ ^$9 :$ :$]93GV $$$ k3p:3 :k9$tdp  & & & 's ', 's: ?W DvK&{f THE MEMORY SYSTEM OF A HIGH-PERFORMANCE PERSONAL COMPUTER54Memory references specify a 16 or 28 bit displacement, and one of 32 base registers of 28 bits; thevirtual address is the sum of the displacement and the base. Virtual address translation, or mapping,is implemented by table lookup in a dedicated memory. Main storage is the permanent home ofdata stored by the memory system. The storage is necessarily slow (i.e., it has long latency, whichmeans that it takes a long time to respond to a request), because of its implementation in cheap butslow dynamic MOS RAMs (random access memories). To make up for being slow, storage is big,and it also has high bandwidth, which is more important than latency for sequential references. Inaddition, there is a cache which services non-sequential references with high speed (low latency),but is inferior to main storage in its other parameters. The relative values of these parameters areshown in Table 1.CacheStorageLatency-1151Bandwidth12Capacity1250Table 1: Parameters of the cache relative to storageWith one exception (the IFU), all memory references are initiated by the processor, which thus actsas a multiplexor controlling access to the memory (see 1.2 and [10]), and is the sole source ofaddresses. Once started, however, a reference proceeds independently of the processor. Each onecarries with it the number of its originating task, which serves to identify the source or sink of anydata transfer associated with the reference. The actual transfer may take place much later, andeach source or sink must be continually ready to deliver or accept data on demand. It is possiblefor a task to have several references outstanding, but order is preserved within each type ofreference, so that the task number plus some careful hardware bookkeeping is sufficient to matchup data with references. Table 2 lists the types of memory references executable by microcode. Figure 2, a picture of thememory system's main data paths, should clarify the sources and destinations of data transferred bythese references (parts of Figure 2 will be explained in more detail later). All references, includingfast I/O references, specify virtual, not real addresses. Although a microinstruction actually specifiesa displacement and a base register which together form the virtual address, for convenience we willsuppress this fact and write, for example, Fetch(a) to mean a fetch from virtual address a.A Fetch from the cache delivers data to a register called FetchReg, from which it can be retrieved atany later time; since FetchReg is task-specific, separate tasks can make their cache referencesindependently. An I/ORead reference delivers a 16-word block of data from storage to theFastOutBus (by way of the error corrector, as shown in Figure 2), tagged with the identity of therequesting task; the associated output device is expected to monitor this bus and grab the datawhen it appears. Similarly, the processor can Store one word of data into the cache, or do anI/OWrite reference which demands a block of data from an input device and sends it to storage (byway of the check-bit generator). There is also a Prefetch reference, which brings a block into thecache. Fetch, Store and Prefetch are called cache references. There are special references to flushdata from the cache and to allow a map entries to be read and written; these will be discussed later.The instruction fetch unit is the only device that can make a reference independently of theprocessor. It uses a single base register, and is treated almost exactly like a processor cache fetch,except that the IFU has its own set of registers for receiving memory data (see [9] for details). Ingeneral we ignore IFU references from now on, since they add little complexity to the memorysystem.YzX{z{z{z{z{z{z{ z{z{zS2#} z } zQV}zP*+ } zN9'M"R K{z{z7JXH }z*G5-E BBcB Bc B(Bc(#B Bc -zBoBco@ }?F? F?(F#? F-z?oF ~z~z gm$~z;~z~z g m4m:D~7z~z g m1~5z~z g m~z1~3<z~z gm7m1)1041 04 1(04(#1 04 -z1o04o - X8)}z2}z (Z }z}z9&{z{z!%R }z}z8# 9"J({z{z  {z{z}X$z= }z0< 6{z{z 1"4#{z{z2}z4 XS D |%2 It[ 4*lY )*dY H]) THE MEMORY SYSTEM OF A HIGH-PERFORMANCE PERSONAL COMPUTER56<==W>W , : HB$ B$'p, x' /$dp, xEpP3xr$+$+$ +$1+$r$:r?@=O +$xd $ $rr9 $ $ Hp 0 H[(5VG- )e/%:.$e1\$3-U$+$e-2$$e-2$N$;$N$;$3<$+$@$&W=$e#$N$e#$3F$+$eM$)&$ $3$+$$$$N%+2U$+x*W,t2U$,t($G+($G+ -p*#+xH+F$G,tF$G-p\,t $r+x+ $r(qVG.$- ).;$$ G$)  9$$)69$ 9G$ 8$U 4$8 $T$$e1 G$ 8H$8 $.1 $81$3 G+$. $9;$4 Hk,$.T$.$9 M$SedGQGQG+rT!QG6tQG!SedG$T Hp?  H j F$)$)e$9)e69$ F$$d)r$Npid GPn89^UVSEC. 1INTRODUCTION57All busses are 16 bits wide; blocks of data are transferred to and from storage at the rate of 16 bitsevery half cycle (30 ns). This means that 256 bits can be transferred in 8 cycles or 480 ns., which issomewhat more than the 375 ns cycle time of the RAM chips that implement main storage. Thus ablock size of 256 bits provides a fairly good match between bus and chip bandwidths; it is also acomfortable unit to store in the cache. The narrow busses increase the latency of a storage transfersomewhat, but they have little effect on the bandwidth. A few hundred nanoseconds of latency isof little importance either for sequential I/O transfers or for delivery of data to a properlyfunctioning cache.Various measures are taken to maximize the performance of the cache. Data stored there is notwritten back to main storage until the cache space is needed for some other purpose (the write-backrather than the more common write-through discipline [1, 14]); this make it possible to use memorylocations much like registers in an interpreted instruction set, without incurring the penalty of mainstorage accesses. Virtual rather than real addresses are stored in the cache, so that the speed ofmemory mapping does not affect the speed of cache references. (Translation buffers [15, 20] areanother way to accomplish this.) This would create problems if there were multiple address spaces.Although these problems can be solved, in a single-user environment with a single address spacethey do not even need to be considered.Another important technique for speeding up data manipulation in general, and cache references inparticular, is called bypassing. Bypassing is one of the speed-up techniques used in the CommonData Bus of the IBM 360/91 [19]. Sequences of instructions having the form(1) register _ computation1(2) computation2 involving the registerare very common. Usually the execution of the first instruction takes more than one cycle and ispipelined. As a result, however, the register is not loaded at the end of the first cycle, andtherefore is not ready at the beginning of the second instruction. The idea of bypassing is to avoidwaiting for the register to be loaded, by routing the results of the first computation directly to theinputs of the second one. The effective latency of the cache is thus reduced from two cycles to onein many cases (see 2.3).The implementation of the Dorado memory reflects a balance among competing demands:for simplicity, so that it can be made to work initially, and maintained when componentsfail; for speed, so that the performance will be well-matched to the rest of the machine;for space, since cost and packaging considerations limit the number of components andedgepins that can be used.None of these demands is absolute, but all have thresholds that are costly to cross. In the Doradowe set a somewhat arbitrary speed requirement for the whole machine, and generally tried to savespace by adding complexity, pushing ever closer to the simplicity threshold. Although many of thecomplications in the memory system are unavoidable consequences of the speed requirements, someof them could have been eliminated by adding hardware.2. The cacheThe memory system is organized into two kinds of building blocks: pipeline stages, which providethe control (their names are in SMALL CAPITALS), and resources, which provide the data paths andmemories. Figure 3 shows the various stages and their arrangement into two pipelines. One,consisting of the ADDRESS and HITDATA stages, handles cache references and is the subject of thissection; the other, containing MAP, WRITETR, STORAGE, READTR1 and READTR2, takes care ofstorage references and is dealt with in 3 and 4. References start out either in PROC, the processor,or in the IFU.\){G, ;zUOTNPR({z%QFR O QN>;L){z{z'K6 H CF>} Ez} z$CUA<@wM >|zB=oB;#8W7< }zA5 {z83`1'/W. '.,|>*H)t P'$S"m6 S92T 3+)|z %-z4 |X |zH}z{ z}zt', {z{z<l{z{z{z{z{z4{zd{z Ha THE MEMORY SYSTEM OF A HIGH-PERFORMANCE PERSONAL COMPUTER58<==3{z"3Q V  S |}z }z }z-;#t  }zOlC, }zd& Hd9\$Ux9!$UsUs9#$:U:9$ $    r H H$r  $$y$*: $+V(*:$+V H( H2 H5 H4$254 $> $?<>$? H< Hr  M$rd d$tN 9x(x3x=x#$-$8r$V $9$c$U@$9$$yx&V0:V  $ Ur% r%VG r#Gd+VNBG%GGd$*GV$9$V$V 8$ t?  [ U$ !r$ x t" ! y$$y# p%r$!t x  G9B&SEC. 2THE CACHE59<==$$ $ %@$"s$ G G  +G  G +&(sG?$Gr&$qG&$qG?G&:Gr:G:G#$"$&&@O$&%js$2It)N7)N,)N',)N<%$H:>;'8U$;$U$#?# V? V)$*$'FGrBeFr(t6 ,, $U0 $U5W $U-H1:W ?> b9F$r:F$r=$=F$r^% r=;)Nx#eGDdrG69G+ )G3+$$t p""&Ck$-A$&A$&A$'=$',tBO",x*&4G$94G$9"3+$r4)#pw0t b 5 b*=$,9x$^UiHF THE MEMORY SYSTEM OF A HIGH-PERFORMANCE PERSONAL COMPUTER60miss: the address is not present in the cache. During normal operation, it is not possible for morethan one column to match. The entire matching process can be seen in Figure 4, between 60 and90 ns after the start of the reference. The cache address latched at 90 contains the row, word andcolumn; these 14 bits address a single word in CacheD. Of course, only the top 16 key bits of theaddress need be matched, since the row bits are used to select the row, and all the words of a blockare present or absent together.Four flag bits are stored with each cache entry to keep track of its status. We defer discussion ofthese flags until 4.2.2 Cache dataThe CacheD resource stores the data for the blocks whose addresses appear in CacheA; closelyassociated with it are the StoreReg and task-specific FetchReg registers which allow the processor todeliver and retrieve its data independently of the memory system's detailed timing. CacheD is quitesimple, and would consist of nothing but a 16K by 16 bit memory were it not for the bandwidth ofthe storage. To keep up with storage the cache must be able to accept a word every half cycle (30ns.). Since its memory chips cannot cycle this fast, CacheD is organized in two banks which run ahalf-cycle out of phase when transferring data to or from the storage. On a hit, however, bothbanks are cycled together and CacheD behaves like an 8K by 32 bit memory. A multiplexor selectsthe proper half to deliver into FetchReg. All this is shown in Figure 4.Figure 4 does not, however, show how FetchReg is made task-specific. In fact, there is a 16-wordmemory FetchRegRAM in addition to the register shown. The register holds the data value for thecurrently executing task. When a Fetch reference completes, the word from CacheD is alwaysloaded into the RAM entry for the task that made the reference; it is also loaded into FetchReg ifthat task is the one currently running. Whenever the processor switches tasks, the FetchRegRAMentry for the new task is read out and loaded into FetchReg. Matters are further complicated bythe bypassing scheme described in the next subsection.StoreReg is not task-specific. The reason for this choice and the problem it causes are explained in 5.1.2.3 Cache pipeliningFrom the beginning of a cache reference, it takes two and a half cycles before the data is ready inFetchReg, even if it hits and there are no delays. However, because of the latches in the pipeline(some of which are omitted from Figure 4), a new reference can be started every cycle, and if thereare no misses the pipeline will never clog up, but will continue to deliver a word every 60 ns. Thisworks because nothing in later stages of the pipeline affects anything that happens in an earlierstage.The exception to this principle is delivery of data to the processor itself. When the processor usesdata that has been fetched, it depends on the later stages of the pipeline. In general thisdependency is unavoidable, but in the case of the cache the bypassing technique described in 1.4is used to reduce the latency. A cache reference logically delivers its data to the FetchReg registerat the end of the cycle following the reference cycle (actually halfway through the second cycle, at150 in Figure 4). Often the data is then sent to a register in the processor, with a (microcode)sequence such as(1)Fetch(address)(2)register _ FetchReg(3)computation involving register. The register is not actually loaded until cycle (3); hence the data, which is ready in the middle ofcycle (3), arrives in time, and instruction (2) does not have to wait. The data is supplied to thecomputation in cycle (3) by bypassing. The effective latency of the cache is thus only one cycle inthis situation._RzX{z{z{z{z{z{z{ z{z{zXLWwKU%<To MRBQgN<HLH}X Ez9D 4'BWAD?~9&=L{.zB-+3*2+(|$}}X!Rz\ OJU@"B8$OA -+_QO { #~z !AlD 9d  HdHSEC. 2THE CACHE61Unfortunately this sleight-of-hand does not always work. The sequence(1)Fetch(address)(2)computation involving FetchReg actually needs the data during cycle (2), which will therefore have to wait for one cycle (see 5.1).Data retrieved in cycle (1) would be the old value of FetchReg; this allows a sequence of fetches(1)Fetch(address1)(2)register1 _ FetchReg, Fetch(address2)(3)register2 _ FetchReg, Fetch(address3)(4)register3 _ FetchReg, Fetch(address4). . .to proceed at full speed.3. The storage pipelineCache misses and fast I/O references use the storage portion of the pipeline, shown in Figure 3. Inthis section we first describe the operation of the individual pipeline stages, then explain how fastI/O references use them, and finally discuss how memory faults are handled. Using I/O referencesto expose the workings of the pipeline allows us to postpone until 4 a close examination of themore complicated references involving both cache and storage.3.1 Pipeline stagesEach of the pipeline stages is implemented by a simple finite-state automaton that can change stateon every microinstruction cycle. Resources used by a stage are controlled by signals that itsautomaton produces. Each stage owns some resources, and some stages share resources with others.Control is passed from one stage to the next when the first produces a start signal for the second;this signal forces the second automaton into its initial state. Necessary information about thereference type is also passed along when one stage starts another.3.1.1 The ADDRESS stageAs we saw in 2, the ADDRESS stage computes a reference's virtual address and looks it up inCacheA. If it hits, and is not I/ORead or I/OWrite, control is passed to HITDATA. Otherwise, controlis passed to MAP, starting a storage cycle. In the simplest case a reference spends just onemicroinstruction cycle in ADDRESS, but it can be delayed for various reasons discussed in 5.3.1.2 The MAP stageThe MAP stage translates a virtual address into a real address by looking it up in a hardware tablecalled the MapRAM, and then starts the STORAGE stage. Figure 5 illustrates the straightforwardconversion of a virtual page number into a real page number. The low-order bits are not mapped;they point to a single word on the page.Three flag bits are stored in MapRAM for each virtual page:ref, set automatically by any reference to the page;dirty, set automatically by any write into the page;writeProtect, set by memory-management software (using the MapWrite reference). A virtual page not in use is marked as vacant by setting both writeProtect and dirty, an otherwisenonsensical combination. A reference is aborted by the hardware if it touches a vacant page,attempts to write a write-protected page, or causes a parity error in the MapRAM. All three kindsof map fault are passed down the pipeline to READTR2 for reporting; see 3.1.5.^{G/^;zX+ 9U~zTOQVPs]N~z L~z K~z I~z H E@|X=z{z{z8<1\:{z{z; |z{z{z 9)1.793}X0{zH.9#-s}z!}z+$}z*k<(9$}X}!z{z# 9{z{~z{z{~z{}z {z,!1 {z=2}X}z{zH}{z{z *,{$P!{z ~z1 ~z/H~ z/~z "}z~ z~z l |zBE{zd}z!{z l Hcx~ THE MEMORY SYSTEM OF A HIGH-PERFORMANCE PERSONAL COMPUTER62<==l$9:Xl$9<l$98l$9C;l$9Al$9Etl$95 3$91t 3$93 3$9( 3$9- 3$9* 3$9/; 3$9&W $]&W $8 3$9&W"H$%$("$9"$"$]"$9:"$9s"$9"$9$"$9!"$9&W"$9:%$9%$9%$9 %$9V%$9%$9%$9 %$] %$s%$9 '$ s(e$] s(e]$ ($9 s*9$:-e9$ s+P$9:+,]$:+,$]+&,#eGG x _ _y$ & $ _ _# _$ &$ _$ _'s8(H$/;0WH$p?x _8]$7 &0W9$/; _s $$s$s$s$s$ :$s $# r$'s$#$#$. $4;$U.$.$y= $DX$=$=$$]$ $ 9$  H$ Hr$ : H$ &&!W&-&<& sp  s+ ]&,&,&,&,A&,z&,&,&,' #e$#e"#e ^#e%#e#e#ez#e' )B +{ - / 2& 4_ 6 F&CA?{=B; 86(  Vs #!*;0W1t5W 5W + $( e +# d#(/;> d>>=x 9;p%;O$=$O$ O$:s's H9$4; H$$dDG-SEC. 3THE STORAGE PIPELINE65and completes the StorageRAM cycle ( 3.1.3). READTR1 and READTR2 transport the data, controlthe error corrector, and deliver the data to FastOutBus ( 3.1.5). Fault reporting, if necessary, isdone by READTR2 as soon as the condition of the last quadword in the block is known ( 3.3).It is clear from Figure 7 that an I/ORead can be started every eight machine cycles, since this is thelongest period of activity of any stage. This would result in 530 million bits per second ofbandwidth, the maximum supportable by the memory system. The inner loop of a fast I/O task canbe written in two microinstructions, so if a new I/ORead is launched every eight cycles, one-fourthof the processor capacity will be used. Because ADDRESS is used for only one cycle per I/ORead,other tasksnotably the emulatormay continue to hit in the cache when the I/O task is notrunning.I/OWrite(x) writes into virtual location x a block of data delivered by a fast input device, togetherwith appropriate Hamming code check bits. The data always goes to storage, never to the cache,but if address x happens to hit in the cache, the entry is invalidated by setting a flag ( 4). Figure8 shows that an I/OWrite proceeds through the pipeline very much like an I/ORead. The difference,of course, is that the WRITETR stage runs, and the READTR1 and READTR2 stages, although they run,do not transport data. Note that the write transport, from FastInBus to WriteBus, proceeds inparallel with mapping. Once the block has been loaded into WriteReg, STORAGE issues a writesignal to StorageRAM. All that remains is to run READTR1 and READTR2, as explained above. If amap fault occurs during address translation, the write signal is blocked and the fault is passed alongto be reported by READTR2.<==_%@%B%E %GB%I{%9'7'5{'3B'1 '.','*^'**A*!z*#*%*(%**^*A-e-e-e-e-e-e z-e A-e*-e55-$]V5P$97f9$V49$ 2$9V2f]$V2f$] /:$ ,$9 ,]$ ,$],$9,$9:,$9 ,$9V,$9,$9,$9)*4$9%:*4$9's*4$9V*4$9 *4$9*4$9#*4$9*$]*$+*4$9,I$))$;t'l$9)'I$)'I$]2'l$9.'l$90W'l$9+'l$97'l$94'l$99;'l$9H$$9DX$$9F$$9;t$$9?$$9=$$9B$$99;$$]9;$$K$$99;&$530-/$9/$9V/$9 /$9:/$9/$9/$9 /$] /$#/$9 1s$ A0- z0-0-0-0-:0-s0-0-s,$9,$9H-- /$9/$9s/$90-0- 0-@txC=p!,A$9H$@H$!Wl$er$srr H z HH eH  $!W$# O$r5-]$%:d<K7 THE MEMORY SYSTEM OF A HIGH-PERFORMANCE PERSONAL COMPUTER66Figure 8 shows a delay in the MAP stage's handling of I/OWrite. MAP remains in state 3 for twoextra cycles, which are labelled with asterisks, rather than state numbers, in Figure 8. This delayallows the write transport to finish before the write signal is issued to StorageRAM. Thissynchronization and others are detailed in 5.Because WRITETR takes eleven cycles to run, I/OWrites can only run at the rate of one every elevencycles, yielding a maximum bandwidth for fast input devices of 390 million bits per second. At thatrate, two of every eleven cycles would go to the I/O task's inner loop, consuming 18 percent of theprocessor capacity. But again, other tasks could hit in the cache in the remaining nine cycles.3.3 History and fault reportingThere are two kinds of memory system faults: map and storage. A map fault is a MapRAM parityerror, a reference to a page marked vacant, or a write operation to a write-protected page. Astorage fault is either a single or a double error (within a quadword) detected during a read. Inwhat follows we do not always distinguish between the two types.Consider how a page fault might be handled. MAP has read the MapRAM entry for a reference andfound the virtual page marked vacant. At this point there may be another reference in ADDRESSwaiting for MAP, and one more in the processor waiting for ADDRESS. An earlier reference may bein READTR1, perhaps about to cause a storage fault. The processor is probably several instructionsbeyond the one that issued the faulting reference, perhaps in another task. What to do? It wouldbe quite cumbersome at this point to halt the memory system, deal with the fault, and restart thememory system in such a way that the fault was transparent to the interrupted tasks. Instead, theDorado allows the reference to complete, while blunting any destructive consequences it mighthave. A page fault, for example, forces the cache's vacant flag to be set when the read transport isdone. At the very end of the pipeline READTR2 wakes up the Dorado's highest-priority microtask,the fault task, which must deal appropriately with the fault, perhaps with the help of memory-management software.Because the fault may be reported well after it happened, a record of the reference must be keptwhich is complete enough that the fault task can sort out what has happened. Furthermore,because later references in the pipeline may cause additional faults, this record must be able toencompass several faulting references. The necessary information associated with each reference,about 80 bits, is recorded in a 16-element memory called History. Table 3 gives the contents ofHistory and shows which stage is responsible for writing each part. History is managed as a ringbuffer and is addressed by a 4-bit Storage Reference Number or SRN, which is passed along withthe reference through the various pipeline stages. When a reference is passed to the MAP stage, acounter containing the next available SRN is incremented. A hit writes the address portion ofHistory (useful for diagnostic purposes; see below), without incrementing the SRN counter.EntryWritten byVirtual address, reference type, task number, cache columnADDRESSReal page number, MapRAM flags, map faultMAPStorage fault, bit corrected (for single errors)READTR2Table 3: Contents of the History memoryTwo hardware registers accessible to the processor help the fault task interpret History: FaultCountis incremented every time a fault occurs; FirstFault holds the SRN of the first faulting reference.The fault task is awakened whenever FaultCount is non-zero; it can read both registers and clearFaultCount in a single atomic operation. It then handles FaultCount faults, reading successiveelements of History starting with History[FirstFault], and then yields control of the processor to the]zX{z{z{z{z{z{z{ z{z{zWT{z{z{~z{z U_TLK{zRO{z {z{~z.N7&L,{z{z+KWG}XCz(}z}z{zBc*.@H?[<<0{z{z:<{9(z{z{z}z7{z"76 F4#}z(3 R1P0M."{z-} z7+ (YU&G %QC#}z<"I}z 6$A9{z/${z9{z* G{z  ((#  -zoo}. F F(F# F-zoFz:.{z{z.{Nz0.{     ( (#  -z o oU zX"t>} z(} z {zlI 7dMD Hb8SEC. 3THE STORAGE PIPELINE67other tasks. If more faults have occurred in the meantime, FaultCount will have been incrementedagain and the fault task will be reawakened.The fault task does different things in response to the different types of fault. Single bit errors,which are corrected, are not reported at all unless a special control bit in the hardware is set. Withthis bit set, the fault task can collect statistics on failing storage chips; if too many failures areoccurring, the bit can be cleared and the machine can continue to run. Double bit errors may bedealt with by re-trying the reference; a recurrence of the error must be reported to the operatingsystem, which may stop using the failing memory, and may be able to reread the data from the diskif the page is not dirty, or determine which computation must be aborted. Page faults are the mostlikely reason to awaken the fault task, and together with write-protect faults are dealt with byyielding to memory-management software. MapRAM parity errors may disappear if the reference isre-tried; if they do not, the operating system can probably recover the necessary information.Microinstructions that read the various parts of History are provided, but only the emulator and thefault task may use them. These instructions use an alternate addressing path to History which doesnot interfere with the SRN addressing used by references in the pipeline. Reading base registers,the MapRAM, and CacheA can be done only by using these microinstructions.This brings us to a serious difficulty with treating History as a pure ring buffer. To read aMapRAM entry, for example, the emulator must first issue a reference to that entry (normally aMapRead), and then read the appropriate part of History when the reference completes; similarly, aDummyRef (see Table 3) is used to read a base register. But because other tasks may run and issuetheir own references between the start of the emulator's reference and its reading of History, theemulator cannot be sure that its History entry will remain valid. Sixteen references by I/O tasks, forexample, will destroy it.To solve this problem, we designate History[0] as the emulator's "private" entry: MapRead,MapWrite, and DummyRef references use it, and it is excluded from the ring buffer. Because thefault task may want to make references of its own without disturbing History, another private entryis reserved for it. The ring buffer proper, then, is a 14-element memory used by all referencesexcept MapRead, MapWrite, and DummyRef in the emulator and fault task. For historical reasons,Fetch, Store and Flush references in the emulator and fault task also use the private entries; the tagmechanism ( 4.1) ensures that the entries will not be reused too soon.In one case History is read, rather than written, by a pipeline stage. This happens during a readtransport, when READTR1 gets from History the cache address (row and column) it needs for writingthe new data and the cache flags. This is done instead of piping this address along from ADDRESSto READTR1.4. Cache-storage interactionsThe preceding sections describe the normal case in which the cache and main storage functionindependently. Here we consider the relatively rare interactions between them. These can happenfor a variety of reasons:Processor references that miss in the cache must fetch their data from storage.A dirty block in the cache must be re-written in storage when its entry is needed.Prefetch and flush operations explicitly transfer data between cache and storage.I/O references that hit in the cache must be handled correctly.Cache-storage interactions are aided by the four flag bits that are stored with each cache entry tokeep track of its status (see Figure 4). The vacant flag indicates that an entry should never match; itis set by software during system initialization, and by hardware when the normal procedure forloading the cache fails, e.g., because of a page fault. The dirty flag is set when the data in the entryis different from the data in storage because the processor did a store; this means that the entry^{G(e;zXL(4V'S02R@"PYO ;M5(L ZJHI.,G}${z0EUBNAJ Q?{z= >B{z?;X9{zX8~z7"6~z:5M3:{z{z 1.J~z-P~z~z= +H*H5)(~z~z~z!'@~z~z~zL%>"E! {zJ>{z{z2|Xz}z/ SOOR Q {z{z<t I~z4l>"~z'd#=$ Hc THE MEMORY SYSTEM OF A HIGH-PERFORMANCE PERSONAL COMPUTER68must be written back to storage before it is used for another block. The writeProtected flag is a copyof the corresponding bit in the map. It causes a store into the block to miss and set vacant; theresulting storage reference reports a write-protect fault ( 3.3). The beingLoaded flag is set for about 15 cycles while the entry is in the course of being loaded from storage; whenever the ADDRESSstage attempts to examine an entry, it waits until the entry is not beingLoaded, to ensure that theentry and its contents are not used while in this ambiguous state.When a cache reference misses, the block being referenced must be brought into the cache. Inorder to make room for it, some other block in the row must be displaced; this unfortunate iscalled the victim. CacheA implements an approximate least-recently-used rule for selecting thevictim. With each row, the current candidate for victim and the next candidate, called next victim,are kept. The victim and next victim are the top two elements of an LRU stack for that row;keeping only these two is what makes the replacement rule only approximately LRU. On a miss, thenext victim is promoted to be the new victim and a pseudo-random choice between the remainingtwo columns is promoted to be the new next victim. On each hit, the victim and next victim areupdated in the obvious way, depending on whether they themselves were hit.The flow of data in cache-storage interactions is shown in Figure 2. For example, a Fetch thatmisses will read an entire block from storage via the ReadBus, load the error-corrected block intoCacheD, and then make a one-word reference as if it had hit.What follows is a discussion of the four kinds of cache-storage interaction listed above.4.1 Clean missWhen the processor or IFU references a word w that is not in the cache, and the location chosen asvictim is vacant or holds data that is unchanged since it was read from storage (i.e., its dirty flag isnot set), a clean miss has occurred. The victim need not be written back, but a storage read mustbe done to load into the cache the block containing w. At the end of the read, w can be fetchedfrom the cache. A clean miss is much like an I/ORead, which was discussed in the previous section.The chief difference is that the block from storage is sent not over the FastOutBus to an outputdevice, but to the CacheD memory. Figure 9 illustrates a clean miss.All cache loads require a special cycle, controlled by READTR1, in which they get the correct cacheaddress from History and write the cache flags for the entry being loaded; the data paths ofCacheA are used to read this address and write the flags. This RThasA cycle takes priority over allother uses of CacheA and History, and can occur at any time with respect to ADDRESS, which alsoneeds access to these resources. Thus all control signals sent from ADDRESS are inhibited byRThasA, and ADDRESS is forced to idle during this cycle. Figure 9 shows that the RThasA cycleoccurs just before the first word of the new block is written into CacheD. (For simplicity andclarity we will not show RThasA cycles in the figures that follow.) During RThasA, the beingLoadedflag is cleared (it was set when the reference was in ADDRESS) and the writeProtected flag is copiedfrom the writeProtected bit in MapRAM. As soon as the transport into CacheD is finished, the wordreference that started the miss can be made, much as though it had hit in the first place. If thereference was a Fetch, the appropriate word is sent to FetchReg in the processor (and loaded intoFetchRegRAM); if a Store, the contents of StoreReg are stored into the new block in the cache.If the processor tries to use data it has fetched, it is prevented from proceeding, or held until theword reference has occurred (see 5.1). Each fetch is assigned a sequence number called its tag,which is logically part of the reference; actually it is written into History, and read when needed byREADTR1. Tags increase monotonically. The tag of the last Fetch started by each task is kept inStartedTag (it is written there when the reference is made), and the tag of the last Fetch completedby the memory is kept in DoneTag (it is written there as the Fetch is completed); these are task-specific registers. Since tags are assigned monotonically, and fetches always complete in orderwithin a task, both registers increase monotonically. If StartedTag=DoneTag, all the fetches thatZ\zX{z{z{z{z{z{z{ z{z{zT"$~ zRP~zP*~ zOy={Mz+~ zLq=IF:GPF>}z@ D=} zC6<{zAF{z @.K >H=&C9B~z8w'5653Y/}X ,z {z~z5+B)} z2(2~z~z& |{z{~z.% L#> [4{zPS1~zC{z K:{z~z{z?~zCI~z~z~ ;z{z ~ z~ z {z 33(1~z.+{z~zF 3"}z | P}z Tt{z3~z} z-~z l}z~z  Md_ H_RSEC. 4CACHE-STORAGE INTERACTIONS69<==F{zt!2m=7'eE{z4] 3;UF5D"&: B }X~z ~zOlF~z#{z{z~zd\ \ Hac t2kOp t $    k O2y+$$$$]$G$$+$2$$$$$$$9k$$2A$Gd$k+$9$l$$$$$$$$$$$$d$$$$ z$ V$ V+G$ z$]$:$G$r$$$$r$%$+$$r$]$$$G$$]A$$]$%2#2"2!2 22l2O2Ok3kkkkkkkA$$G$A$]lO3 $$$$d$V$]$ d$$G$ d$]+$V$dG$+$]lO3y]$Vk$    k O3Od$]+$$l$d$2O $s 9$r r $ r  $ r O $O d9$V +$ r 9$r"s $# $9# 9$9$$ r$9$ 9$r O $ $  @$ $!s$d&$lO3%$$G$%$]&3k%k#k"k!k kklk-2,2+2*2)2(l2'P2&32%$$]$%$%$%G$%$]%$&r$]%$$-$-r$.$&r$lG$$$+k$]$]]$ O k   ]]y$    !2%$,92%93$1 $/$.$-$+{$,$' 9!z99$$$$$%$$$#$"$!z$ ^$A$%$' $(%$)B$*^$]99 99z$]$A$$$$ ]$ z$$$$$ A$ $$ $$$$-l$Vpd \ *3"lSEC. 4CACHE-STORAGE INTERACTIONS71A Flush explicitly removes the block containing the addressed location from the cache, rewriting itin storage if it is dirty. Flush is used to remove a virtual page's blocks from the cache so that itsMapRAM entry can be changed safely. If a Flush misses, nothing happens. If it hits, the hitlocation must be marked vacant, and if it is dirty, the block must be written to storage. To simplifythe hardware implementation, this write operation is made to look like a victim write. A dirty Flushis converted into a FlushFetch reference, which is treated almost exactly like a Prefetch. Thus, whena Flush in ADDRESS hits, three things happen:the victim for the selected row of CacheA is changed to point to the hit column;the vacant flag is set;if the dirty flag for that column is set, the Flush is converted into a FlushFetch. Proceeding like a Prefetch, this does a useless read (which is harmless because the vacant flag hasbeen set), and then a write of the dirty victim. Figure 11 shows a dirty Flush. The FlushFetchspends two cycles in ADDRESS, instead of the usual one, because of an uninteresting implementationproblem.<==AF~z~ ?~z{z==t2}X}} z{z{~z~z. ?{z{~z | U0't{z{~z1)2l !4&{z{~z d  Ha: $:  $$: $: O $%: 9$r r$9Vt$!V$ 9$rz +$ 9$ O $  $  $ 9$r $ ks$+$O$$$:3:::::k: : : ::::2:O: k$ ]$OkO$]G$z$O$ @$] G$ $ @$$z$]$ $$ $$ $$$2Okz$]VG$V$z$3OlV V!V"V#V%V&3V'OVV$O$]z$A$]G$$A$$ $]A$d$'$&$&$ $G$s$+$$]OG$A$$$$d$$$$$$$$$$$A$$$$ $O$9 $k kd$G G$ rk$ +$ $ $ $:$ 3$ $ kA$ $O$$k$A$$]$ A$ O$ k   2$ p ts:V$$$d$$:u :t# , , ," + z r: y$ ,,,,,($3Ol  ]$] :G$ :$ ]$ !"#%&3'O(l(lV)V*V+V,V-V/V03V :$!3$] ]$(%$](G$($(%$($($](%$H$0$/$/$($G$!V$!$OOk$$]$   !z -l$d$d$d$ d$ $d$ @d$d$d$d$d$ yd$ ]d$d$$d$Ad$]d$zd$ ]*^d$)Ad$(%d$'d$%d$Ad$ ]d$!zd$"d$#d$$d$$d$d$d$d$d$d$!z',d$+zd$-d$.d$/d$1 d$3d$2%,2%d$ $y2ss $dpdD UT3$ THE MEMORY SYSTEM OF A HIGH-PERFORMANCE PERSONAL COMPUTER72<==,:}X 6z {z{z{z5o:{z{z3{z2{z0{z9/<{z5 -,.,4" {z*{z{z0),E&{z3{z{z$} 8{z"{z{z{z!u{z  {z{z ({z {zm {z{~z.{z{z{z {z~ z:{z ~ zB {z ~z,2XM* ~z6{z {z& }X  |z8~z {z #9t A {z.4l4{z{z 2d H_SEC. 5TRAFFIC CONTROL75At the other extreme, the rule could be that a stage waits only if it cannot acquire the resources itwill need in the very next cycle. This would be quite feasible for our system, and the proper choiceof priorities for the various stages can clearly prevent deadlock. However, each stage that may beforced to wait requires logic for detecting this situation, and the cost of this logic is significant.Furthermore, in a long pipeline gathering all the information and calculating which stages canproceed can take a long time, especially since in general each stage's decision depends on thedecision made by the next one in the pipe.For these reasons we adopted a different strategy in the Dorado. There is one point, early in thepipeline but after ADDRESS, at which all remaining conflicts are resolved. A reference is notallowed to proceed beyond that point without a guarantee that no conflicts with earlier referenceswill occur; thus no later stage ever needs to wait. The point used for this purpose is state 3 of theMAP stage, written as MAP.3. No shared resources are used in states 0-3, and STORAGE is not starteduntil state 4. Because there is just one wait state in the pipeline, the exact timing of resourcedemands by later stages is known and can be used to decide whether conflicts are possible. Wenow discuss the details.5.3.1 STORAGE and WRITETRIn a write operation, WRITETR runs in parallel but not in lockstep with MAP; see, for example,Figure 10. Synchronization of the data transport with the storage reference itself is accomplishedby two things.MAP.3 waits for WRITETR to signal that the transport is far enough along that the data willarrive at the StorageRAM chips no later than the write signal generated by STORAGE. Thiscondition must be met for correct functioning of the chips. Figure 13 shows MAP waitingduring an I/OWrite.WRITETR will wait in its next-to-last state for STORAGE to signal that the data hold time ofthe chips with respect to the write signal has elapsed; again, the chips will not work if thedata in WriteReg is changed before this point. Figure 10 shows WRITETR waiting during avictim write. The wait shown in the figure is actually more conservative than it needs tobe, since WRITETR does not change WriteReg immediately when it is started.<=={z{z1{z=$9;>95}X}2z{z}z{z1N<!/ -r{z {z$+{z% {z*j 8{z({z{~z&{z){z% *3#%{z"M ~{z9td2 & H\(t  :s+ $r $AG$2$  $'$' $($d P$A$  $] $A$ $ G$A$]y $O $]VA$'O &3 % # " !    k O 2     y $VA$V PG$y $]kO2y9$%G$kW$%$W$2%$$$z$$$ 3$$W$$ $ +$$$$3$ N$%$$$z$$$3$$W$$$$$d$$3$$$$$B$$$$$$$$$$$$$2$O$$$B$$$$$$$$$$H$$$$$k$$]$ss s s s ks Ns2s2: N: k: ::::2:s2s P$]G$ P$A$] P$$$  $  $sOs$ @$$2kk^O^2^^^^^k^$$9$$kO$$ $A$ k$.$$$$$ $ $$$$r$ V$ 9$$$$9$V$ 9*:$)$($&$%$$ :$!V$"s$#$$$$$$$$r$!V&,s$+V$-$.$/$0$2$4$2,,,9$$d $$ $AG$,O $3$3 $4$ P$+z$,O $]+V $+z$+V $+V G$+z$]# $$ $]#A$3 2l 1P 03 / - , + + * ) (l 'O &3 % # # $#A$# PG$# $]#"! kO2G$ P$] P$   e e ke eeee2e+e NI$2%$U  ^3$2pdk%k$k3$3$t^  &4^ THE MEMORY SYSTEM OF A HIGH-PERFORMANCE PERSONAL COMPUTER765.3.2 CacheD: consecutive cache loadsLoading a block into CacheD takes 9 cycles, as explained in 4.1, and a word reference takes onemore. Therefore, although the pipeline stages proper are 8 cycles long, cache loads must be spacedeither 9 or 10 cycles apart to avoid conflict in CacheD. After a Fetch or Store, the next cache loadmust wait for 10 cycles, since these references tie up CacheD for 10 cycles. After a Prefetch,FlushFetch or dirty I/ORead, the next cache load must wait for 9 cycles. STORAGE sends MAP asignal that causes MAP.3 to wait for one or two extra cycles, as appropriate. Figure 14 shows a Fetchfollowed by a Prefetch, followed by a Store, and illustrates how CacheD conflict is avoided by extracycles spent in MAP.3 Note that the Prefetch waits two extra cycles, while the Store only waits oneextra.<==z~z~zH {z~z#~zG6t2}XzB< L N4'}z&5(,D  P{z{z* t{z1{zB lQ${z!d  ZHa!$!$d!$$!$$$"$$!$$!$$"%$!s$$#$3$9l$k2H$G$9!k$$$$$$$2%$3$ !$ @!$ !$$ !$$ ]$ 9"$$ ]!$$ !$$ "%$ 9!s$$ #$93$9l$kH$G]$!k$@$$$9$$$%$93$!$$ !$ $ !$ $ @"$H$ d#k$"$#G$#k$d$]"$V3$93l$kH$Gz$!k$]$$$V$3$$%$V3$!$$!$$!$$!$]!$!$$!$$z$V"$$z!$$2!$$2"%$V!s$$#$%$$]$%$y3$2t N k   %$$]$]VOk$]s3G$s%$$" Ws:+ :$9; $r ]$ $ :$$ $r. $r$9($92$9%:/ :*4:: ]@$z$rpt" W d" W" W% $%$$%$%$]$$$ 2OkA$]G$$A$ssssss3sOsO:l:: :!:":#:%:$$]A$$]G$$$$z$]$+$%$$z$$$z$G$:$$ y$] V3G$ V%$ y$($3Ol  ]$] :G$ :$ ]$ s!s"s#s%s&3s'Os(ls(l:):*:+:,:-:/:03: :$!3$] ]$(%$](G$($(%$($(z$](%$H$0$/z$/$(z$G$!V$!$$]s3G$s%$$%#"!lsz2$"#%&3'O(l)**^$]*:G$*:$*^$*s+s,s-s/s03s1Ps2ls2l:3:4:5:6:7:9::4:*:$+3$]*^$2%$]2G$2$2%$2$2z$]2%$#H$:$9z$9$2z$%G$+W$+$"$]"s3G$"s%$"$V3@$# $98 $9# $9"s 8 $97 !$!$       %:*:/3B% %%#$ #$#$,22%2724^$3B$5{$6$7$8$; $2%$1 $/$.$-$+z$,$'2!z22$$$$$$$$$#$"$!z$ ]$A$%$'$(%$)A$*^$]22 22z$]$A$$$$ ]$ y$$$$$ @$ $$ $$$$5{$9$! 7 dp)!$$!$$]39$dF U%;-&+SEC. 5TRAFFIC CONTROL77Figure 15 shows a Store with clean victim followed by a Fetch with dirty victim and illustrates thisinterlock. ADDRESS waits until cycle 26 to start WRITETR. Also, the fetch waits in MAP.3 until thesame cycle, thus spending 13 extra cycles there, which forces the fetch victim to spend 13 extracycles in ADDRESS. The two-cycle gap in the use of CacheD shows that the fetch could have leftMAP.3 in cycle 24.<==$D$D$E$.eH$=B$>$]=$=B$=$=G$=B$]5z$6P$]5W:$EPD4CA@?>==^$?z$@$A$F%$B$C$B=B72%,E $"+ 9: p0"d$q/FI& g THE MEMORY SYSTEM OF A HIGH-PERFORMANCE PERSONAL COMPUTER78Main storage boards are the same size as logic boards but are designed to hold an array of MOSRAMs instead of random ECL logic. A pair of storage boards make up a module, which holds 512Kbytes (plus error correction) when populated with 16K RAMs, 2M bytes with 64K RAMs, or 8Mbytes with (hypothetical) 256K RAMs. There is room for four modules, and space not used forstorage modules can hold I/O boards. Within a module, one board stores all the words with evenaddresses, the other those with odd addresses. The boards are identical, and are differentiated bysideplane wiring.A standard Dorado contains, in addition to its storage boards, eleven logic boards, including disk,display, and network controllers. Extra board positions can hold additional I/O controllers. Threeboards implement the memory system (in about 800 chips); they are called ADDRESS, PIPE, andDATA, names which reflect the functional partition of the system. ADDRESS contains theprocessor interface, base registers and virtual address computation, CacheA (implemented in 256 by4 RAMs) and its comparators, and the LRU computation. It also generates Hold, addresses DATA onhits, and sends storage references to PIPE.DATA houses CacheD, which is implemented with 1K by 1 or 4K by 1 ECL RAMs, and holds 8K or32K bytes respectively. DATA is also the source for FastOutBus and WriteBus, and the sink forFastInBus and ReadBus, and it holds the Hamming code generator-checker-corrector. PIPEimplements MapRAM, all of the pipeline stage automata (except ADDRESS and HITDATA) and theirinterlocks, and the fault reporting, destination bookkeeping, and refresh control for the MapRAMand StorageRAM chips. The History memory is distributed across the boards: addresses onADDRESS, control information on PIPE, and data errors on DATA.Although our several prototype Dorados can run at a 50 nanosecond microcycle, most of themachines run instead at 60 nanoseconds. This is due mainly to a change in board technology froma relatively expensive point-to-point wire-routing method to a cheaper Manhattan routing method. 7. PerformanceThe memory system's performance is best characterized by two key quantities: the cache hit rateand the percentage of cycles lost due to Hold ( 5.1). In fact, Hold by itself measures the cache hitrate indirectly, since misses usually cause many cycles of Hold. Also interesting are the frequenciesof stores and of dirty victim writes, which affect performance by increasing the frequency of Holdand by consuming storage bandwidth. We measured these quantities with hardware event-counters,together with a small amount of microcode that runs very rarely and makes no memory referencesitself. The measurement process, therefore, perturbs the measured programs only trivially.We measured three Mesa programs: two VLSI design-automation programs, called Beads and Placer;and an implementation of Knuth's TEX [8]. All three were run for several minutes (several billionDorado cycles). The cache size was 4K 16-bit words.Percent of cycles:Percent of references:Percent of misses:ReferencesHoldHitsStoresDirty victims Beads36.48.1499.2710.516.3Placer42.94.8999.8218.765.5TEX38.46.3399.5515.234.9Table 5: Memory system performanceTable 5 shows the results. The first column shows the percentage of cycles that contained cachereferences (by either the processor or the IFU), and the second, how many cycles were lost becausethey were held. Hold, happily, is fairly rare. The hit rates shown in column three are gratifyingly^qXrqrqrqrqrqrqr qrqrqXK1&rVqrqDUC1rqrqSrq8R;rqrq8 P NO3LYJ0rqrqICsqsqG|sq-sq EYDtrqrq!tq sqB!sq?sq4rqrq>Asq.<Fs;9q rq-rqrq9 2r81qrqI6sqsqsq3+&1T0z`+sX (|q@&&tqtq%t7tq#0,t"lqG OdT9rq5rq>1.^^  ^((#^  -z^oouX 0;* )#0;<F< F<(F#< F-z<oFNq)#0; )#0; Frq)#0;     ( (#  -z o o>"lK vq4d tq1 HcLSEC. 7PERFORMANCE79largeall over 99 percent. This is one reason that the number of held cycles is small: a miss cancause the processor to be held for about thirty cycles while a reference completes. In fact, the tableshows that Hold and hit are inversely related over the programs measured. Beads has the lowest hitrate and the highest Hold rate; Placer has the highest hit rate and the lowest Hold rate.The percentage of Store references is interesting because stores eventually give rise to dirty victimwrite operations, which consume storage bandwidth and cause extra occurrences of Hold by tying upthe ADDRESS section of the pipeline. Furthermore, one of the reasons that the StoreReg registerwas not made task-specific was the assumption that stores would be relatively rare (see thediscussion of StoreReg in 5.1). Table 5 shows that stores accounted for between 10 and 19percent of all references to the cache.Comparing the number of hits to the number of stores shows that the write-back discipline used inthe cache was a good choice. Even if every miss had a dirty victim, the number of victim writeswould still be much less than under the write-through discipline, when every Store would cause awrite. In fact, not all misses have dirty victims, as shown in the last column of the table. Thepercentage of misses with dirty victims varies widely from program to program. Placer, which hadthe highest frequency of stores and the lowest frequency of misses, naturally has the highestfrequency of dirty victims. Beads, with the most misses but the fewest stores, has the lowest. Thelast three columns of the table show that write operations would increase about a hundredfold ifwrite-through were used instead of write-back.Acknowledgements The concept and structure of the Dorado memory system are due to Butler Lampson and ChuckThacker. Much of the design was brought to the register-transfer level by Lampson and BrianRosen. Final design, implementation, and debugging were done by the authors and Ed McCreight,who was responsible for the main storage boards. Debugging software and microcode were writtenby Ed Fiala, Willie-Sue Haugeland, and Gene McDaniel. Haugeland and McDaniel were also ofgreat help in collecting the statistics reported in 7. Useful coments on earlier versions of thispaper were contributed by Forest Baskett, Gene McDaniel, Jim Morris, Tim Rentsch, and ChuckThacker. References1.Bell, J. et. al. An investigation of alternative cache organizations. IEEE Trans. Computers C-23, 4, April 1974, 346-351.2.Bloom, L., et. al. Considerations in the design of a computer with high logic-to-memory speed ratio. Proc. GigacycleComputing Systems, AIEE Special Pub. S-136, Jan. 1962, 53-63.3.Conti, C.J. Concepts for buffer storage. IEEE Computer Group News 2, March 1969, 9-13.4.Deutsch, L.P. Experience with a microprogrammed Interlisp system. Proc. 11th Ann. Microprogramming Workshop, PacificGrove, Nov. 1979.5.Forgie, J.W. The Lincoln TX-2 input-output system. Proc. Western Joint Computer Conference, Los Angeles, Feb. 1957,156-160.6.Geschke, C.M. et. al. Early experience with Mesa. Comm. ACM 20, 8, Aug. 1977, 540-552.7.Ingalls, D.H. The Smalltalk-76 programming system: Design and implementation. 5th ACM Symp. Principles ofProgramming Languages, Tucson, Jan. 1978, 9-16.8.Knuth, D.E. TEX and METAFONT: New Directions in Typesetting. American Math. Soc. and Digital Press, Bedford, Mass.,1979.9.Lampson, B.W. et. al. An instruction fetch unit for a high-performance personal computer. Technical Report CSL-81-1,Xerox Palo Alto Research Center, Jan. 1981. Submitted for publication.10.Lampson, B.W., and Pier, K.A. A processor for a high performance personal computer. Proc. 7th Int. Symp. ComputerArchitecture, SigArch/IEEE, La Baule, May 1980, 146-160. Also in Technical Report CSL-81-1, Xerox Palo Alto ResearchCenter, Jan. 1981.11.Liptay, J.S. Structural aspects of the System/360 model 85. II. The cache. IBM Systems Journal 7, 1, 1968, 15-21.12.Metcalfe, R.M., and Boggs, D.R. Ethernet: distributed packet switching for local computer networks. Comm. ACM 19, 7,July 1976, 395-404.]rG- ;qWW.+U9)TOtqI Rtq6tqOtq)%N0tq Lrq JKOI FH D6"C] uq5AHtq @U=> :=MJ;>:EV8 !3sX0qV/?4-M ,78$*)/)/_'?&'!Ts rq{rGwr9xwyrq{r wrVw{rwvr&3q{r+xwyrq{rDw)r{Nq{r5w'r{iq{r wrwxryrq{rPwxw{r 6q{r xwxwr8{  Qq{r wrYvr{ Glq{rVw{. r vr9vr{Iq{rMxwyrq{rfwxwyr{dD Hb THE MEMORY SYSTEM OF A HIGH-PERFORMANCE PERSONAL COMPUTER8013.Mitchell, J.G. et. al. Mesa Language Manual. Technical Report CSL-79-3, Xerox Palo Alto Research Center, April 1979.14.Pohm, A. et. al. The cost and performance tradeoffs of buffered memories. Proc. IEEE 63, 8, Aug. 1975, 1129-1135.15.Schroeder, M.D. Performance of the GE-645 associative memory while Multics is in operation. Proc. ACM SigOpsWorkshop on System Performance Evaluation, Harvard University, April 1971, 227-245. 16.Tanenbaum, A.S. Implications of structured programming for machine architecture. Comm. ACM 21, 3, March 1978, 237-246.17.Teitelman, W. Interlisp Reference Manual. Xerox Palo Alto Research Center, Oct. 1978.18.Thacker, C.P. et. al. Alto: A personal computer. In Computer Structures: Readings and Examples, 2nd edition, Sieworek,Bell and Newell, eds., McGraw-Hill, 1981. Also in Technical Report CSL-79-11, Xerox Palo Alto Research Center, August1979. 19.Tomasulo, R.M. An efficient algorithm for exploiting multiple arithmetic units. IBM J. R&D 11, 1, Jan. 1967, 25-33.20.Wilkes, M.V. Slave memories and segmentation. IEEE Trans. Computers C-20, 6, June 1971, 674-675.DqXrqrqrqrqrqrqr qrqrqrq{rGwrwrvr3Fq{rwr=wxwyr q{r^wxw{ a)r+ q{rSwxwyr{ |q{r wr..q{r wrw*r{Dvr/{ q{rRxwyrdq{r0xwyr NH: HELVETICA HELVETICA  HELVETICA HELVETICA HELVETICA  HELVETICA HELVETICA HELVETICA MATH  LOGO  TIMESROMAN   TIMESROMAN  TIMESROMAN   TIMESROMAN  TIMESROMAN  TIMESROMAN TIMESROMAN TIMESROMAN  TIMESROMAN TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN TIMESROMAN TIMESROMAN  TIMESROMAN HELVETICA  HELVETICA  HELVETICA HELVETICATEMPLATE@> L f $ -2 m< nE N nX`;h r z{ d  " > O05  K%e) & 1 N{.%(+0z59ress MemFig7.press MemFig8Zoh\'''ss MemFig3.press MemFig4.press MemFig5.pZh\'''emFig14.press MemFig15.press MemFig2.preZh\'''11j/-+memFinal.presspiera13-Jan-81 16:21:19 PST+