GIER/Hastighed
Forhistorie
Jeg har skrevet et program i GIER maskinkode der beregner pi med mange decimaler. Når man kører det på den rigtige GIER og på simulatoren får man samme resultat - men timingen er ikke helt rigtig. Der er op til 5 procents forskel i hvor langt tid det tager.
Der kan være flere årsager til dette:
- Fejl i simulatoren
- Forskel i klokfrekvens imellem simulator og vores GIER
- Tromlehastigheden
Det skal vise sig at alle tre punkter er relevante.
Testprogrammer
Hastigheden i simulatoren styres ved at sample fortegnet for resultatregisteret hvert 10. klokpuls, sende det til lydkortet som er sat til at køre med en hastighed på 1/10 af GIER klokfrekvens. I litteraturen står klokfrekvensen til at være 450-455 kHz, afhængig af hvor man læser.
For at gøre det nemmere at lave tidsmålinger på simulatoren har jeg snydt: Der er nogle ubrugte ordre i GIER, jeg har implementeret én af dem, ZL, så den tager kloktælleren (som derefter nulstilles), deler med klokfrekvensen og gemmer som flydende tal i RF. Så kan man lave følgende lille ALGOL procedurefunktion som returnerer køretiden, i sekunder, siden sidste kald:
real procedure clock count; code clock count; 1, 37; zl , grf p-1 ; RF:=clock count; stack[p-1]:=RF; e;
Det første testprogram læser tromlekanal 0 20480 gange:
; procedure time1; b a20 d3: pa a3 t 39 ; reset counter in a3 a1: pi (a3) ; show counter in indicator pa a4 t 511 ; reset counter in a4 a2: vk 0 , lk 983 ; read track 0 to 983 a4: bt 0 t -1 ; Count 511 to 0 hv a2 a3: bt 0 t -1 ; Count 39 to 0 hv a1 hr s1 e
Testprogram nr. 2 laver multiplikation, division og cyklisk skift:
; procedure time2; b a20 d4: pa a3 t 200 ; reset counter in a3 a1: pi (a3) ; show counter in indicator pa a4 t 511 ; reset counter in a4 a2: pm a5 , mln a6 ; M:=811241407; RM:=811241407*786382913; dl a5 , cl 120 ; R:=RM/811241407; RM:=RM shift 120; mln a6 , dl a5 cl 120 , mln a6 dl a5 , cl 120 mln a6 , dl a5 a4: bt 0 t -1 ; count 511 to 0 hv a2 a3: bt 0 t -1 ; count 200 to 0 hv a1 hr s1 a5: qq 811241407.39 a6: qq 786382913.39 e
Testprogram nr. 3 har en lang kæde af indirekte adressering:
; procedure time3; b a20 d5: pa a3 t 80 ; reset counter in a3 a1: pin(a3) ; show counter in indicator; R:=0; pa a4 t 511 ; reset counter in a4 a2: ar (a5) ; R:=R+1; a4: bt 0 t -1 ; count 511 to 0 hv a2 a3: bt 0 t -1 ; count 80 to 0 hv a1 hr s1 a5: qq (r1) qq (r1) qq (r1) ... ; 697 identical lines not shown qq (r1) qq r1 qq 1.39 e
Det sidste testprogram er test nr. 8 fra biblioteket af testprogrammer for GIER:
Det læser samtlige tromlekanaler og måler hastigheden for læsningen. Hastigheden for tromlen er opgivet som 50 rotationer i sekundet, i gennemsnit skal der læses 40.5 ord pr. læsning (der læses 41 ord, det første ord kan være ufuldstændigt fordi læsningen starter midt i ordet), det giver en læsetid på 1/50*40.5/40 = 20.25 msek.
Den centrale del af testprogrammet er vist hér:
[50] bt 320 t-1 ;select - [51] vk -1 V t1 ;- tracks 0-319 [52] hv 75 ;go to 75 if track no. =319 [53] lkn -512 ;read track, zeroes to R [54] hk 57 ;if transfer finished the go to 57 - [55] ar 74 ;else add 113 microseconds [56] hv 54 ;and go to 54 [57] qq ;empty [58] nc 20 NKA ;output for all tracks if KA=1 - [59] ps 66 V ;- else only output for tracks - [60] hv 50 ; - with transfer time |= 20 ms ... [74] qq t113 ;number of microseconds
Se den fulde kode på side 16 i Test programmer til GIER.
Celle 51 vælger først kanal 0, derefter kanal 1, etc. I celle 53 læses kanalen og R nulstilles. Derefter følger en løkke på tre celler:
[54] hk 57 ;if transfer finished the go to 57 - [55] ar 74 ;else add 113 microseconds [56] hv 54 ;and go to 54
hk ordren betyder: Hvis tromlen er ledig, lav et sekvenshop til celle 57. Ellers er ordren blind. I celle 55 adderes tallet 113 med enhed i bit 19 til R registeret. Tallet i celle 74 indeholder tiden for løkken i mikrosekunder med enhed i bit 19. Hvis vi sætter 1024=1000 får vi så tiden i millisekunder med enhed i bit 9 i R når løkken er færdig. I celle 58 testes om læsetiden er de forventede 20 millisekunder. Hvis ikke (eller hvis KA er sat) udskrives kanalnummeret og læsetiden (i millisekunder, uden decimaler) på skrivemaskinen (udskriftsrutinen er ikke vist). Celle 57 indeholder blindordren qq. Den har det formål at den kan udskiftes med en zq ordre (stop) så læsetiden kan aflæses i R på manøvrebordet efter hver kanallæsning.
Tidsmålinger på GIER
Poul-Henning fandt en HP 5316B tæller som vi har lavet nogle målinger med.
Vi kiggede først på kortet i B1-27 som indeholder oscillatoren der laver klokfrekvensen:
Se det fulde diagram på GIER/Plade/0249.
Det skal bemærkes at der ikke er noget krystal til at holde frekvensen, den kan således være meget afhængig af temperatur og værdien af kondensatoren der står til "ca. 680 pF".
Klokfrekvensen kan måles på ben nr. 2.
Ben nr. 10, step, indeholder også interessant information: Hvis en mikrokode ordre indeholder trinnet Gm_step sendes der en puls til kort 0249. Det får kortet til at springe den næste klokpuls over der sendes ud på ben 1n. Det bruges hvis elektronikken i fx adder eller ferritlager skal have ekstra tid.
Vi har lavet målinger både af klokfrekvensen og på forholdet imellem step og klokfrekvens.
Hastigheden på tromlen måles på plade C5-22, GIER/Plade/0257. Tromlen har ud over de 320 kanaler med data også tre klokspor. KP I har én puls per rotation, KP II en puls pr. celle (40 pr. rotation) og KP III en puls for hver bit. KP I er ført til pladen i C5-22. Hastigheden kan måles på testpunkt 6.
Målinger
Med proberne på klokkortet:
måles klokfrekvensen:
Den er 461 kHz. GIER'en var lige blevet tændt, efter et stykke tid falder frekvensen. På en maskine der har stået tændt længe måles 460.85 kHz.
Nu flytter vi den ene probe over på forstærkeren til tromlens KP I puls:
Frekvensen måles:
Den er 49.59 Hz.
I de efterfølgende målinger måles forholdet imellem antal Gm_step og klokpulser.
Test program 1: 31.54%
Test program 2: 3.39%
Test program 3: 14.35%
Simulatoren har en mulighed for at lave en testudskrift for hver mikrotrin, det har jeg slået til imens jeg kører hvert af de tre programmer.
Et eksempel på udskrift ser sådan ud:
Mode1: MA=01 BUS: 0 0000111001 0000000000 0000000000 0000000000 00 clock: 394174433 Mode1: MA=02 BUS: 0 0000111001 1111111111 0000000000 0000000000 00 clock: 394174434 Mode1: MA=03 BUS: 1 1111111111 0000111001 1111111111 1111111111 11 clock: 394174435 Mode1: MA=04 BUS: 0 0000010101 1111111111 0000000000 0000000000 00 clock: 394174436 AC: 0 0000000000 0000000000 0000000000 0000000000 10 0 MQ: 0 1111111110 0000000000 0000000000 0000000000 00 -2147483648 RF: 0 s: 21 p: 2 tk: 0 by: 17 spild: 0 T: 0 OA: 0 OB: 0 TA: 0 TB: 1 PA: 0 PB: 1 QA: 0 QB: 0 RA: 0 RB: 0 Execute[57]: AR (63) clock: 394174437 Mode1: MA=05 BUS: 0 0000111111 0000000000 0000100100 0000000000 00 clock: 394174437 Mode1: MA=08 BUS: 0 0000000000 0000000000 1111111111 1111111111 11 clock: 394174438 Mode1: MA=13 BUS: 1 1111111111 1111111111 1111111111 1111111111 11 clock: 394174439 Mode1: MA=20 BUS: 0 0000111111 0000111001 1111111111 1111111111 11 clock: 394174440 Mode1: MA=21 BUS: 1 1111111111 1111111111 1111111111 1111111111 11 clock: 394174441 Mode1: MA=23 BUS: 0 0000000000 0000000000 1111111111 1111111111 11 clock: 394174442 Mode1: MA=24 BUS: 0 0000000001 1111111111 0000000110 1111111111 11 clock: 394174443 Mode1: MA=08 BUS: 0 0000111111 0000000000 1111111111 1111111111 11 clock: 394174444 Mode1: MA=13 BUS: 1 1111111111 1111111111 1111111111 1111111111 11 clock: 394174445 Mode1: MA=20 BUS: 0 0001000000 0000111001 1111111111 1111111111 11 clock: 394174446 Mode1: MA=21 BUS: 1 1111111111 1111111111 1111111111 1111111111 11 clock: 394174447 Mode1: MA=23 BUS: 0 0000000000 0000000000 1111111111 1111111111 11 clock: 394174448 Mode1: MA=24 BUS: 0 0000000001 1111111111 0000000110 1111111111 11 clock: 394174449 Mode1: MA=08 BUS: 0 0001000000 0000000000 1111111111 1111111111 11 clock: 394174450 Mode1: MA=13 BUS: 1 1111111111 1111111111 1111111111 1111111111 11 clock: 394174451 Mode1: MA=20 BUS: 0 0001000001 0000111001 1111111111 1111111111 11 clock: 394174452 Mode1: MA=21 BUS: 1 1111111111 1111111111 1111111111 1111111111 11 clock: 394174453 Mode1: MA=23 BUS: 0 0000000000 0000000000 1111111111 1111111111 11 clock: 394174454 Mode1: MA=24 BUS: 0 0000000001 1111111111 0000000110 1111111111 11 clock: 394174455 Mode1: MA=08 BUS: 0 0001000001 0000000000 1111111111 1111111111 11 clock: 394174456 Mode1: MA=13 BUS: 1 1111111111 1111111111 1111111111 1111111111 11 clock: 394174457 Mode1: MA=20 BUS: 0 0001000010 0000111001 1111111111 1111111111 11 clock: 394174458 Mode1: MA=21 BUS: 1 1111111111 1111111111 1111111111 1111111111 11 clock: 394174459 Mode1: MA=23 BUS: 0 0000000000 0000000000 1111111111 1111111111 11 clock: 394174460 Mode1: MA=24 BUS: 0 0000000001 1111111111 0000000110 1111111111 11 clock: 394174461 ... Mode1: MA=08 BUS: 1 1011111100 0000000000 1111111111 1111111111 11 clock: 394178650 Mode1: MA=13 BUS: 1 1111111111 1111111111 1111111111 1111111111 11 clock: 394178651 Mode1: MA=14 BUS: 1 1011111101 0000111001 1111111111 1111111111 11 clock: 394178652 Gm_step: MA=01 AR/SR/AN/SN[765]: 0 0000000000 0000000000 0000000000 0000000001 00 1 Mode2: MA=01 BUS: 1 1111111111 1111111111 1111111111 1111111111 11 clock: 394178654 Mode3: MA=16 BUS: 0 0000000000 0000000000 0000000000 0000000000 10 clock: 394178655 Gm_step: MA=21 Mode3: MA=21 BUS: 0 0000000000 0000000000 0000000000 0000000001 00 clock: 394178657 Mode2: MA=24 BUS: 1 1111111111 1111111111 1111111111 1111111111 11 clock: 394178658 Mode2: MA=22 BUS: 0 0000000000 0000000000 0000000000 0000000001 11 clock: 394178659 Gm_step: MA=12 Mode2: MA=12 BUS: 0 0000000000 1111111111 1111111111 1111111111 11 clock: 394178661 Gm_step: MA=02 Mode4: MA=02 BUS: 1 1111111111 1111111111 1111111111 1111111111 11 clock: 394178663
For hver linie kan man se hvilken mode GIER er i (1-4), mikrotrinadressen MA, hvad bussen indeholder efter trinnet og kloktælleren.
I mode 1 udføres adresseberegningen (den er lang hér pga. den lange kæde af indirekte adresseringer), mode 2 er selve grundoperationen, mode 3 er en hjælpemode til de aritmetiske operationer og mode 4 er afslutningen på ordren hvor evt. indikatoroperationer og ombytning af R og M registrene (X-mærket ordre) foregår.
Der bliver også udskrevet hver gang der udføres et Gm_step trin (man kan se at kloktælleren øges med et ekstra trin).
Jeg har lavet et lille perl program som beregner forholdet imellem Gm_step trin og kloktrin, kører man dette og sammenligner med de målte tal får man:
Program | Simulator | Måling |
1 | 31.47% | 31.54% |
2 | 2.60% | 3.39% |
3 | 0.19% | 14.35% |
De passer ikke godt sammen. Især program 3 er helt ved siden af.
En nærlæsning af simulatoren afslører forklaringen: Jeg havde glemt 4 Gm_step trin! Et af dem er i løkken der gentages for hvert indirekte adresseringstrin.
Efter denne rettelse ser testudskriften således ud:
Mode1: MA=01 BUS: 0 0000111001 0000000000 0000000000 0000000000 00 clock: 396652497 Mode1: MA=02 BUS: 0 0000111001 1111111111 0000000000 0000000000 00 clock: 396652498 Mode1: MA=03 BUS: 1 1111111111 0000111001 1111111111 1111111111 11 clock: 396652499 Mode1: MA=04 BUS: 0 0000010101 1111111111 0000000000 0000000000 00 clock: 396652500 AC: 0 0000000000 0000000000 0000000000 0000000000 10 0 MQ: 0 1111111110 0000000000 0000000000 0000000000 00 -2147483648 RF: 0 s: 21 p: 2 tk: 0 by: 17 spild: 0 T: 0 OA: 0 OB: 0 TA: 0 TB: 1 PA: 0 PB: 1 QA: 0 QB: 0 RA: 0 RB: 0 Execute[57]: AR (63) clock: 396652501 Mode1: MA=05 BUS: 0 0000111111 0000000000 0000100100 0000000000 00 clock: 396652501 Mode1: MA=08 BUS: 0 0000000000 0000000000 1111111111 1111111111 11 clock: 396652502 Mode1: MA=13 BUS: 1 1111111111 1111111111 1111111111 1111111111 11 clock: 396652503 Mode1: MA=20 BUS: 0 0000111111 0000111001 1111111111 1111111111 11 clock: 396652504 Gm_step: MA=21 Mode1: MA=21 BUS: 1 1111111111 1111111111 1111111111 1111111111 11 clock: 396652506 Mode1: MA=23 BUS: 0 0000000000 0000000000 1111111111 1111111111 11 clock: 396652507 Mode1: MA=24 BUS: 0 0000000001 1111111111 0000000110 1111111111 11 clock: 396652508 Mode1: MA=08 BUS: 0 0000111111 0000000000 1111111111 1111111111 11 clock: 396652509 Mode1: MA=13 BUS: 1 1111111111 1111111111 1111111111 1111111111 11 clock: 396652510 Mode1: MA=20 BUS: 0 0001000000 0000111001 1111111111 1111111111 11 clock: 396652511 Gm_step: MA=21 Mode1: MA=21 BUS: 1 1111111111 1111111111 1111111111 1111111111 11 clock: 396652513 Mode1: MA=23 BUS: 0 0000000000 0000000000 1111111111 1111111111 11 clock: 396652514 Mode1: MA=24 BUS: 0 0000000001 1111111111 0000000110 1111111111 11 clock: 396652515 Mode1: MA=08 BUS: 0 0001000000 0000000000 1111111111 1111111111 11 clock: 396652516 Mode1: MA=13 BUS: 1 1111111111 1111111111 1111111111 1111111111 11 clock: 396652517 Mode1: MA=20 BUS: 0 0001000001 0000111001 1111111111 1111111111 11 clock: 396652518 Gm_step: MA=21 Mode1: MA=21 BUS: 1 1111111111 1111111111 1111111111 1111111111 11 clock: 396652520 Mode1: MA=23 BUS: 0 0000000000 0000000000 1111111111 1111111111 11 clock: 396652521 Mode1: MA=24 BUS: 0 0000000001 1111111111 0000000110 1111111111 11 clock: 396652522
Og optællingen viser nu et andet resultat:
Program | Simulator | Måling |
1 | 31.50% | 31.54% |
2 | 3.39% | 3.39% |
3 | 14.35% | 14.35% |
Det passer meget bedre. Program 1 er ikke helt i orden, men det skyldes at tromlen ikke er helt på plads endnu.
For at få styr på tromlen køres test program nr. 8. Tælleren viser Gm_step ratio på 19.74%, simulatoren 20.09%. Tæt på, men ikke så flot som de andre tests uden tromle.
Tromlen fungerer på den måde at når en læsning fra tromlen er sat i gang regner GIER videre. Når der kommer et ord fra tromlen afbrydes udførslen af mikrotrin og et særligt mikroprogram på 8 MAB trin udføres. Dér gemmes cellen i ferritlageret og GIER fortsætter med afvikling af de almindelige mikrotrin. MA flipflop'erne på kort A1-2 til A1-13 styrer de almindelige MA adresser, og flipflop'erne på kort A1-19 til A1-22 styrer MAB adresserne.
Jeg fik den idé at måske kræver tromle DMA'en mere end 8 klokpulse...
Hvis vi piller tromlemikrotrinnene ud af debug udskriften og tæller op får vi:
clocks: 2948805 steps: 613374 ratio: 20.8007650556751
Så kan vi beregne antallet af tromleklokpulse, x, vha. følgende ligning: 613374/(2948805+x)=0.1974
Det giver x=158459
Igennem hele test8 programmet læses 320 kanaler à 41 ord: x/320/41 = 12.07 klokpulse pr. ord.
I næste afsnit skal vi se om det nu også kan passe at der går 12 og ikke 8 kloks pr. ord!
Logikanalysator
Jeg forklarede mit problem til Poul-Henning og han fandt straks en HP logikanalysator 16500B frem og gik i gang med at tage GIER'ens EEG:
Ledningerne forbindes til de første 16 MA trin og de 8 MAB trin. Test program 1 startes. Det læser en tromlekanal og venter på at læsningen er færdig. Imens overføres cellerne med MAB pulse:
På dette tidspunkt står GIER i starten af VK ordren og venter på at tromlen bliver ledig. Det kan vi se i mikrokoden for VK:
Den vil stå og loope imellem MA 1 og MA 12 indtil tromlen bliver ledig. Bemærk at MA 12 har et "step" trin.
Vi kigger nærmere på billedet fra logikanalysatoren og sætter nogle tal på klokpulsene:
De øverste linier 0-15 er MA 1 til MA 16, de nederste 0-7 er MAB 8 til MAB 1.
Jeg kan se følgende forklaring på hvad man ser:
Trin | Forklaring |
1 | MA 1 i VK mikroprogrammet |
2 | MA 12 i VK |
3 | step i MA 12 i VK |
4 | |
5 | |
6 | MAB 1 |
7 | MAB 2 |
8 | MAB 3 |
9 | MAB 4 |
10 | MAB 5 |
11 | MAB 6 |
12 | MAB 7 |
13 | MAB 8 |
14 | |
15 | |
16 | MA 1 i VK ordren |
17 | MA 12 i VK ordren |
Der er altså to ekstra klokpulse på hver side af de 8 MAB trin, dvs. transporten af et ord tager 12 klokpulse.
Jeg har ingen forklaring på hvorfor MAB 1 ikke vises i trin 6, men bliver vist i trinene 7-13.
GIER har nogle indbyggede testprogrammer som kan vælges med en omskifter i kabinettet. Disse er alle på 8 mikrotrin og styres også af MAB flipflop'erne. Hvis man vælger ét af dem får man en fin trappe vist hvor MAB-1 til MAB-8 vælges ét ad gangen.
Tilbage til start
Jeg har nu lavet følgende rettelser i min simulator:
- Klokfrekvensen sættes til 460850 Hz
- Tromlen kører 49.5 Hz, dvs. DMA overførslen af et ord sker for hver 460850/49.5/40 = 232.753 klokpuls
- Jeg har tilføjet de manglende Gm_step trin.
Jeg har målt, med stopur, hvor lang tid det tager at køre testprogrammerne 1-3 på GIER'en og sammenlignet med simulatorens ZL ordre:
Program | GIER | Simulator |
1 | 422.6 | 424.1 |
2 | 390.2 | 389.0 |
3 | 448.1 | 447.3 |
Tallene fra GIER er gennemsnit af to målinger. Jeg havde ikke målt klokfrekvensen da målingerne blev foretaget.
Tromlehastigheden er testet med test8 programmet. Jeg lavede en variant der lister hastigheden med decimaler og har beregnet gennemsnittet. På GIER'en giver det 20.49 ms pr. kanal, på simulatoren 20.72 ms.
Mit program til beregning af PI giver følgende tal, i sekunder:
Decimaler | GIER | Simulator |
790 | 215 | 214 |
3190 | 2633 | 2635 |
7. maj 2015
Jeg har leget lidt videre med logikanalysatoren.
Man kan lave skærmdumps på MS-DOS formatterede disketter, det gør det lidt nemmere:
Billedet viser GIER's indbyggede testprogram nr. 2 (læsning fra ferritlager). Man ser at MAB1-8 trigger (er lave) én ad gangen. Imens dette sker er MA1 lav.
Kigger vi igen på et billede omkring en tromletransport:
Det kunne tolkes som at MAB1 er lav enten når MAB-1 er aktiv eller MA'erne er aktive.