GIER/Hastighed

Fra DDHFwiki
Spring til navigationSpring til søgning

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:

  1. Fejl i simulatoren
  2. Forskel i klokfrekvens imellem simulator og vores GIER
  3. 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:

112.png

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:

Clockkort2.jpg

måles klokfrekvensen:

Clock4.jpg

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:

Tromlekort1.jpg

Frekvensen måles:

Tromle2.jpg

Den er 49.59 Hz.

I de efterfølgende målinger måles forholdet imellem antal Gm_step og klokpulser.

Test1a.jpg

Test program 1: 31.54%

Test2a.jpg

Test program 2: 3.39%

Test3a.jpg

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:

Phklogik.jpg

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:

Logik1.jpg

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:

Vk.png

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:

Logik1y.png

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:

  1. Klokfrekvensen sættes til 460850 Hz
  2. Tromlen kører 49.5 Hz, dvs. DMA overførslen af et ord sker for hver 460850/49.5/40 = 232.753 klokpuls
  3. 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:

B01.png

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:

B02.png

Det kunne tolkes som at MAB1 er lav enten når MAB-1 er aktiv eller MA'erne er aktive.