Our "skunk works in Waterloo" has just (1999-11-30) received an AlphaServer 4100 (with DUNIX 4.1 installed) from a cancelled project and we've been commissioned to port a relatively large business application (consisting of ~ 200 VMS programs) from a dual VAX-8550 cluster to Alpha.
This specific machine is an AlphaServer 4100 5/300 which was manufactured in 1996. It contained a single 21164 (EV5) CPU running at 300 MHz with 2 MB of cache and 256 MB of RAM. Five modules can be installed in the CPU chassis (one for the PCI/EISA interconnect and four for CPU's). Because of the clock speed I thought this machine might be a bit of a dog but it "seems" much faster than my VAX-6430 (at least it boots up five times faster). I always have to remind myself that these pipelined super scalar 64-bit RISC CPUs are usually more powerful than they first seem.
The disk subsystem is based upon MYLEX configurable RAID controllers which connect to five "storage works" arrays (each filled with six 4-GB SCSI drives). Since all RAID functions are handled in hardware, the CPU can pay more attention to running the OS and apps. The controller can be modified with a configuration program to support RAID #1 (mirroring), RAID #0 (striping), RAID 0+1 (a.k.a. RAID #10) and RAID #5 (complete multiple disk redundancy). Note that we chose "RAID 0+1" since this method provides that will tolerate multi-drive failure in a single raid-set.
All the chassis boards (except CPU and memory) are either PCI or EISA based so these machines are considerably less expensive than the VAXs they are about to replace.(this activity was due to a misunderstanding on our part; apparently ROMs would have been provided free of charge; oops!)
We received our software distribution library this week so we placed a call to Compaq/HP to acquire some temporary licenses (good for 60 days) through their Software Loan program. We ordered licenses for the following:
We received our temporary licenses and started to install the new software as follows:
note: DEC-BASIC has been renamed Compaq-BASIC for OpenVMS (and now HP-BASIC for OpenVMS)
- the developer's process needed to have /PGFLQUO set to 500,000
- compiling was faster with /WSEXT set to 100,000
- the compiler defaults to /OPTIMIZE=LEVEL=4 which returns some VERY interesting informational messages about source code quality but takes a real long time depending on how many other people are logged in
- when /OPTIMIZE=LEVEL=1 was used, compile time dropped to 21 minutes.
- when /OPTIMIZE=LEVEL=0 was used, compile time dropped to 14 minutes
- Since the same program would compile in 4 minutes using VAX-BASIC on a VAX-6430 (32-bit CISC), I can only imagine what the compiler now has to do when generating instructions for a pipelined super scalar 64-bit RISC
- after linking, the resulting executable was more than twice the size of the VAX equivalent (this is to be expected when moving from CISC to RISC)
1000 option type=explicit external long function funct1(long, long) external long function funct2(long, long, long) print funct1(1%,2%) print funct2(1%,2%,3%) 30000 end 30010 %include "funct1.fun" ! 30020 %include "funct2.fun" !
1000 option type=explicit
external long function funct1(long, long)
external long function funct2(long, long, long)
print funct1(1%,2%)
print funct2(1%,2%,3%)
30000 end
30010 %include "funct1.fun" !
! <--- need some text between included functions
30020 %include "funct2.fun" !
1000 option type=explicit external long function funct1(long, long) external long function funct2(long, long, long) print funct1(1%,2%) print funct2(1%,2%,3%) 30000 end 100 %include "funct1.fun" ! 200 %include "funct2.fun"
- call "sys$getsyi" with a "syi$_page_size" request. VAX is always 512 but Alpha can be any multiple of 8192 (depends on the individual machine).
Notes:
- Use this data to "boundary align" the addresses in the first quadword passed in the call
- Don't use this data to "compute the number of pages requested" since the system call expects 512 byte pagelets
- The starting address must be pushed down to the lower page boundary. For example, it the page size is 8192:
address1 = (address1 and -8192) which clears lower order bits
Note: this is not necessary if the area to be mapped is in a COMMON AND the COMMON is page aligned in memory via the LINK /OPTION command (where an option file specifies the common name in a PSECT with a PAGE align directive)
- The ending address must be pushed up to the upper page boundary. For example, if the page size is 8192:
address2 = (address2 or (8192-1)) which sets lower order bits
- compute the number of requested pagelets:
pages = (address2 - address1 + 1) / 512
Note: the preceding fix is not necessary if you map to the section using the "SEC$M_EXPREG" flag
Program Renovation: Our currently semi-formal method of declaring external functions has made me question whether porting programs "as-is" to a new hardware architecture will always be safe. Everything has worked properly so far but I keep thinking there is room for improvement. After receiving some suggestions from Francois Daigneault in Montreal, I've decided to change to a more formal coding method. Three program examples follow (blank lines have been removed to save space on this page):
1000 ! ! informal example (we never do this but I have seen others who have) ! option type=explicit record QuadWord long long0 long long1 end record external long function sys$bintim ! informal (no inbound parameter list) declare QuadWord QuadBuff call sys$bintime("0 ::15", QuadBuff) ! compute delta time 15 seconds from now 30000 end
1000 ! ! semi-formal example (our current coding practice) ! option type=explicit record QuadWord long long0 long long1 end record external long function sys$bintim (string by desc, QuadWord by ref) ! semi-formal declare QuadWord QuadBuff call sys$bintime("0 ::15", QuadBuff) ! compute delta time 15 seconds from now 30000 end
1000 ! ! formal example (what we will change to) ! option type=explicit %include "starlet" %from %library "sys$library:starlet$basic.tlb" ! system services (formal) declare Basic$QuadWord QuadBuff call sys$bintime("0 ::15", QuadBuff) ! compute delta time 15 seconds from now 30000 end
%include "starlet" %from %library "sys$library:starlet$basic.tlb" !system services %include "$ssdef" %from %library "sys$library:starlet$basic.tlb" !ss$ definitions %include "$syidef" %from %library "sys$library:starlet$basic.tlb" !syi$ definitions %include "$jpidef" %from %library "sys$library:starlet$basic.tlb" !jpi$ definitions %include "lib$routines" %from %library "sys$library:starlet$basic.tlb" !lib$ RTL
$libr/list sys$library:starlet$basic.tlb
$libr/extract=starlet sys$library:starlet$basic.tlb ! we only want book "starlet" (sys$qiow, etc.) $libr/extract=lib$routines sys$library:starlet$basic.tlb ! we only want book "lib$routines" $libr/extract=* sys$library:starlet$basic.tlb ! we want to view the whole library (~5800 blocks)
1000 option type=explicit ! %let %method=2 %if %method=1 %then ! this new method crashes at run time %include "lib$routines" %from %library "sys$library:basic$starlet.tlb" %else ! this old method runs properly at run time and matches published documentation external long function lib$bbcci( long by ref, any by ref) ! from VMS documentation external long function lib$bbssi( long by ref, any by ref) ! from VMS documentation %end %if ! ! the following stub was adapted from a FORTRAN example found in document: ! "OpenVMS RTL Library (LIB$) Manual" ! common(abc)long states(4) ! could be shared memory ! print "doing set of clear bit" if (LIB$BBSSI (42, states())) then print 'State bit 42 was previously set (oops)' else print 'State bit 42 was clear' end if ! print "doing clear of set bit" if (LIB$BBCCI (42, states())) then print 'State bit 42 was set' else print 'State bit 42 was previously clear (oops)' end if 30000 end
1000 option type=explicit %include "lib$routines" %from %library "sys$library:basic$starlet.tlb" ! common(abc)long states(4) ! could be shared memory ! print "doing set of clear bit" if (LIB$BBSSI (42, loc(states()))) then ! address passed by value (not variable passed by reference) print 'State bit 42 was previously set (oops)' else print 'State bit 42 was clear' end if ! print "doing clear of set bit" if (LIB$BBCCI (42, loc(states()))) then ! address passed by value (not variable passed by reference) print 'State bit 42 was set' else print 'State bit 42 was previously clear (oops)' end if 30000 end
Dealing With Unused code:
1000 option type=explicit declare long a,b,c a = 4 + 5 ! optimizer removes this second pass (a is never used after next line is removed) b = a / 0 ! optimizer removes this on the first pass (b is never accessed) 30000 end
1000 option type=explicit declare long a,b,c a = 4 + 5 b = a / 0 print b ! this reference blocks code removal by the optimizer 30000 end
Detecting Non-sense Code:
<sr> $
<ur> type pos_demo.bas
<sr> 1000 option type=explicit !
map(abc) string dev_name$ = 8 ! fixed length string
dev_name$ = "LTA9999" ! insert 7 characters
if pos(dev_name$,":",1%)>0% then ! if a colon was found here
dev_name$ = dev_name$ +":" ! then append a colon (problem line)
!~~~ dev_name$ = edit$(dev_name$,128%) +":" x what the programmer meant
end if !
print dev_name$ !
30000 end !
$
<ur> bas/optim=level=0/warn=all pos_demo
<sr>
dev_name$ = dev_name$ +":"
^
%BASIC-I-EXPNOTRES, expression does not contribute to result
at line number 5 in file DKB0:[NEIL]POS_DEMO.BAS;4
$
<ur> bas/optim=level=1/warn=all pos_demo
<sr> $ ! no informational
More Non-sense Code
<sr> $ <ur> type logic_demo.bas <sr> 1000 option type=explicit declare long rc% ! rc% = sys$qiow(bla...) !~~~ if (rc% and 1%) <> 1% then ! <-- what was intended if rc% and 1% <> 1% then ! <-- what was entered print "error: ";rc% end if 30000 end $ <ur> bas/optim=level=0/warn=all logic_demo ! <-- produces no messages <sr> $ ! <ur> bas/optim=level=1/warn=all logic_demo ! <-- produces messages <sr> if rc% and 1% <> 1% then ^ %BASIC-I-UNREACH, code can never be executed at label at line number 5 in file DKB0:[NEIL]LOGIC_DEMO.BAS;2 $
(note: DEC-C has been renamed Compaq-C; and now HP-C)
- the legacy authors had quite a bit of code that tested for a return value of -1 from C functions "fwrite" and "fread". The compiler humorously informed us that "this may not be what you intended". (we are amazed that the program seemed to work properly for the last 7 years; just luck I guess...)
We changed the -1 reference to 0 as per the DEC-C-RTL documentation
- the legacy authors had created many functions of type "int" but had not returned any values.
We solved this problem by redeclaring these functions as type "void"
- the legacy authors had enabled access to the VAX instruction set with statement "#pragma builtins" and then referenced _MOVC3 over 60 times to copy data to (and from) an OpenVMS "global section" which was being used for IPC (inter process communication). Since _MOVC3 is not available on the Alpha, these references would not compile properly.
We solved this problem by writing a macro to redefine _MOVC3 as a call to function "memcpy" (these lines should actually be renovated so the program remains OpenVMS portable)
- the legacy authors had many programs where functions had not been prototyped which caused quite a few compiler messages. (how where these programs originally compiled? With /STANDARD=NONE perhaps?)
We solved this problem by properly prototyping the functions before they were referenced
- the legacy authors called "sys$crmpsc" and "sys$mgblsc" in a unique way that is different than the BASIC example above so renovation is probably not required. However, I think the _ALIGN(OCTAWORD) statement which precedes the variable declarations which get mapped into the "global section" may need to change to __ALIGN(PAGE)
- the legacy authors was also accessing VAX instructions _MOVC5 and _LOCC which are not available on the Alpha.
Although _MOVC5 can be replaced with two calls to "memcpy", and _LOCC can be replaced with a call to "memchr", we were able to replace these VAX calls with renovated code that doesn't require them.
Tomorrow I'll attempt to recompile the DEC-C programs with switches "/STANDARD=PORTABLE" and "/STANDARD=MIA" just to see what kind of compiler messages are produced.
more to follow...
System | CPU(s) | Price (US$) |
---|---|---|
DS20E 500 | 2 x 500 MHz | 53k |
DS20E 667 | 2 x 667 MHz | 59k |
ES40 500 Model 1 | 2 x 500 MHz | 68k |
ES40 667 Model 1 | 2 x 667 MHz | 70k |
ES40 883 Model 1 | 2 x 883 MHz | 85k |
some free Alpha Migration Tools (AMT) including:
DECmigrate for OpenVMS Alpha migrates OpenVMS VAX applications to OpenVMS Alpha.
DECmigrate for DIGITAL UNIX migrates ULTRIX RISC applications from MIPS to Compaq's Tru64 UNIX on Alpha
note: DECmigrate has been renamed OpenVMS Migration Software for VAX to Alpha (a.k.a. OMSVA)both these tools perform a binary translation so would only be useful if you don't have your original source code (a scary thought...)
I've just discovered a neat little migration tool. From OpenVMS Alpha you can execute the DCL command $Macro/migrate
to read a 32-bit VAX MACRO source file (.MAR) but generate a 64-bit Alpha object file. You do not
need a license to do this.
However, you do need a license to execute the DCL command $Macro/alpha which reads an Alpha
MACRO-64 source file (.M64) and generates a 64-bit Alpha object file. This is strange since the MACRO assembler was previously
free with OpenVMS on VAX as well as RT-11 and RSX-11M on PDP.
Update: MACRO-64 is a layered product that can still be found on the latest (Alpha OpenVMS 7.2-1)
consolidated software distribution CD-ROMs and requires a license to run. However, if you phone Compaq to purchase a license they
won't be able to find it on their price list because this product is now freeware; it's just that they (Compaq) haven't yet done a
good job promoting this fact. Anyway, here is the required license information courtesy Compaq:
$ LICENSE REGISTER MACRO64 - /ISSUER=DEC - /AUTHORIZATION=OPENVMSFREEWARE - /PRODUCER=DEC - /UNITS=0 - /ACTIVITY=CONSTANT=100 - /CHECKSUM=2-JHNL-LJEJ-CIMA-DOOI $ LICENSE LOAD MACRO64
Click http://h41379.www4.hpe.com/openvms/freeware/index.html if you don't have the access to the consolidated software distribution CD-ROMs.
The following test compiles were done on my AlphaServer 4100 which contains a single 21164 (EV5) CPU running at 300 MHz. with a 2MB cache and 256 MB of RAM. Listing was enabled and no other interactive or batch processes were running. I'm sure that newer machines would run faster and later generation Alpha CPUs would be capable of more sophisticated optimizations.
The following results came from a compile of a 2400 line program with 5 external functions and many system calls.
Optimizer Level | Elapsed Time | Resultant Object File Size |
---|---|---|
0 | 10 seconds | 702 blocks |
1 | 14 seconds | 702 blocks |
2 | 18 seconds | 702 blocks |
3 | 18 seconds | 731 blocks |
4 | 18 seconds | 770 blocks |
Optimizer Level | Elapsed Time | Resultant Object File Size |
---|---|---|
0 | 11 minutes | 13,558 |
1 | 19 minutes | 13,562 |
2 | 42 minutes | 13,562 |
3 | 42 minutes | 13,148 |
4 | 42 minutes | 14,616 |
BTW, the following system changes were made in order to allow the "monster" program to compile in a reasonable amount of time:
AUTHORIZE/my account | WSQUO | 20,000 |
AUTHORIZE/my account | WSEXT | 200,000 |
AUTHORIZE/my account | PGFLQUO | 2,000,000 |
SYSGEN | WSMAX | 100,000 |
The DEC BASIC for OpenVMS Systems "User's Manual" contains the following descriptions for optimizer settings
Optimizer Level Meaning 0 no optimizations are performed 1 some optimizations (like instruction scheduling) and unused code removal 2 more optimizations (like loop unrolling and split lifetime analysis) 3 more optimizations 4 maximum optimizations
Year |
Product |
Internal |
CMOS |
Trans- |
Notes |
Issue |
Issue |
Clock |
Instruction |
---|---|---|---|---|---|---|---|---|---|
1992 |
21064 |
EV4 |
.68u 3 layer metal |
1.7M |
|
1 / 1 xref1 (DTJ) |
1 (2 peak) |
200 |
200 (400) |
1993.5 |
21064A |
EV45 |
.50u |
1.7M |
|
1 / 1 |
1 (2 peak) |
300 |
300 (600) |
1995 |
21164 |
EV5 |
.50u 4 layer metal |
9.3M |
|
2 / 2 xref2 (DTJ) |
2 (4 peak) |
400 |
800 (1600) |
1996.5 |
21164A |
EV56 |
.35u |
9.3M |
|
2 / 2 |
2 (4 peak) |
500 |
1000 (2000) |
1998 |
21264 |
EV6 |
.35u |
15M |
OOE 2 |
4 / 2 |
4 (6 peak) |
600 |
2400 (3600) |
1999 |
21264A |
EV67 |
.28u |
15M |
OOE 2 |
4 / 2 |
4 (6 peak) |
750 |
2800 (4500) |
2000 |
21264B |
EV68 |
.18u |
15M |
OOE 2 |
4 / 2 |
4 (6 peak) |
1000 |
3600 (6000) |
2001 | 21264C | EV69 | .125u | 15M | OOE 2 | 4 / 2 | 4 (6 peak) | 1200 | 4000 (7200) |
2001 |
21364 |
EV7 |
.18u? |
100M |
OCL2 3, OCMC 4, Glueless SMP 5 |
4 / 2 |
4 (6 peak) |
1100 |
4400 (6600) |
2002 |
21364A |
EV79 |
.125u? |
100M |
OCL2 3, OCMC 4, Glueless SMP 5 |
4 / 2 |
4 (6 peak) |
1200 |
4800 (7200) |
2003 |
21464 |
EV8 10 |
.18u? |
250M |
SMT 6 |
? / ? |
8 |
2000 |
16000 |
Notes:
Performance Comparisons
The following performance documents use an internal metric called PERF which appears to be "CPU oriented". Previously, Digital used a "CPU plus I/O" metric called VUP (VAX Units of Performance) where a VAX-11/780 had a VUP rating of ONE. In the following charts a VAX-11/780 has a PERF rating of EIGHT.
Sometime in 2001 we'll be moving our "trouble ticket management" application from our VAX-6430 to an AlphaServer 4100 5/300. Documents behind the links above say the VAX-6430 has a PERF rating of 125 while the AlphaServer 4100 5/300 has a PERF rating of 690. While it is true that my Alpha 4100 boots up 5 times faster than my VAX-6430, only live load tests will prove if it's 5.5 times faster in the real world. (but newer technology is usually better, right?)
p.s. Since I first viewed Compaq's performance comparisons in the Spring of 2000, they've renamed "Alpha PERF" to "Tru64 TPS" but the unit values in the chart have stayed the same. Since Tru64 never ran on VAX (or MIPS), a direct comparison between the hardware platforms is even more unclear.
Relative VAX-Alpha Comparisons using SPEC (Standard Performance Evaluation Corporation)
CISC vs. RISC
CISC (Complicated Instruction Set Computing) was developed when memory (RAM) was very expensive. Simply described, an instruction was fetched from memory and pulled into the CPU where is was decoded into a sequence of microinstructions (also called microcode). Depending on the instruction (POLY was the worst) or the addressing mode the CPU could be working on a particular operation for much longer than just a few ticks of the clock. The system could potentially start an instruction then need to abort it in order to service an exception (interrupt) then need to restart the aborted instruction thus wasting valuable CPU resources.
RISC (Reduced Instruction Set Computing) was developed as an alternative to CISC when the cost of RAM started to fall rapidly. RISC machines were required to execute each instruction in only one clock cycle (on average) without the necessity of converting to microcode. This meant that complicated addressing modes as well as complicated instructions had to be replaced by simple ones. Some work previously done by one instruction was now done by many which means that a RISC machine in a certain sense is really running microcode out of RAM. Now when exception occurs it is like interrupting a CISC machine between the micro ops.
With microcode out of the way, CPU operation became much more deterministic. This allowed other interesting performance features to be more easily implemented like OOE (Out of Order Execution) and SE (Speculative Execution) along with its cousin Branch Prediction. I won't go into instruction pipelining here except to say that one consequence of it occasionally allows multiple instructions to execute simultaneously.
Programming Task | add contents of memory locations 168 and 172 then store the result in 176 |
---|---|
VAX (CISC) | add3 168, 172, 176 ; many micro-ops are running behind this single instruction |
Alpha (RISC) | LDL R0 , 168 ; LDL R16, 172 ; ADDL/V R16, R0, R16 ; STL R16, 176 ; |
Example CISC Addressing Modes (I've lost my VAX programming card so here are some PDP examples until I find it)
PDP-11 (CISC) Register Addressing Modes (PC) | Symbolic | Description |
---|---|---|
2 immediate | #n | operand (immediately) follows the instruction |
3 absolute | @#A | address (immediately) follows the instruction |
6 relative | A | instruction address + 4 + X is the address |
7 relative deferred | @A | instruction address + 4 + X is the address of address |
PDP-11 (CISC) Register Addressing Modes (GP) | Symbolic | Description |
---|---|---|
0 register | R | register contains the operand |
1 register deferred | (R) | register contains the memory address |
2 auto increment | (R)+ | register contains the memory address (post increment by 1 (byte) or 2 (word)) |
3 auto increment deferred | @(R)+ | register contains the memory address of the address (post increment by 1 (byte) or 2 (word)) |
4 auto decrement | -(R) | register contains the memory address (pre decrement by 1 (byte) or 2 (word)) |
5 auto decrement deferred | @-(R) | register contains the memory address of the address (pre decrement by 1 (byte) or 2 (word)) |
6 index | X(R) | R + X is the memory address |
7 index deferred | @X(R) | R + X is the address of the address |
Note: twelve PDP instructions (including MUL + DIV) supported double operands so the microcode was expected to support every permutation of the addressing modes listed in the above two tables.
Many of our 200 programs were written using the following form (which means that we re-compile included functions every time we compile the main program):
1000 %title "my_program.bas" %ident "version 1.23" option type=explicit external long function funct1(long, long) external long function funct2(long, long, long) %include "[.fil]file_map1.rec" ! file definitions are in [.fil] ! print funct1(1%,2%) ! %include "[.inc]in_line1.inc" ! in line BASIC code is in [.inc] print funct2(1%,2%,3%) ! 30000 end ! ! 30010 %include "[.fun]funct1.fun" ! BASIC functions are in [.fun] ! 30020 %include "[.fun]funct2.fun" ! BASIC functions are in [.fun]
So I've written a DCL script to compile all of the BASIC functions in [.fun], then used $LIBRARY/CREATE and $LIBRARY/INSERT to store all the object files in a library. Next, we delete all of the included code that comes after "END" then we compile and link like so:
$bas/optim=level=1 my_program.bas $link my_program, - current_dir:my_library/library/selective
File | Purpose |
---|---|
sys$library:edtsys.edt | required to properly initialize $Edit/edt |
sys$library:sysdevctl.tlb | required by some print queues |
tcpware$tcpware_configure.com | contains LPS print queue definitions |
[tcpware.named]named.* | DNS server support files (most sites only use client DNS software) |
[sys0.decserver]dsvconfig.dat | your DECnet definitions for supporting terminal servers from NCP |
[sys0.syscommon.decserver]pr0801eng.sys | DECserver-200 downloadable image (dropped from consolidated distribution in the mid 1990's) |
[sys0.syscommon.decserver]mneng1.sys | DECserver-90 downloadable image (install from consolidated distribution along with an new version of dsvconfig.com etc.) |
freeware tools like ZIP, UNZIP, DFU, etc. | see the VMS freeware CD-ROM (or http://www.openvms.compaq.com/download/ ) |
Mylex DAC960 RAID support1 | don't throw away old Alpha firmware CD-ROMS mine have a directory "\utility\swxcsr" which contains the RCU (Raid Configuration Utility) as well a RAID module firmware. |
Kermit2 | async interface software (for use where $SET HOST/DTE won't do) new versions are available at www.columbia.edu/kermit |
Subscripts:
1. Make sure you run the standalone program "swxcrmgr" from either ARC or AlphaBIOS and then use the Tools menu to produce a
configuration backup to floppy. One time I powered down the machine to move it 3 meters and, for some reason, the machine
came up with both MYLEX DAC960 cards having no configuration.
2. we had a collection of async interface scripts (DCL) which were being used by non-technical people. Our original scripts called
a VAX version of kermit-32 which was passed a pre-selected port via logical name "ker$comm". The newer version of kermit (called
c-kermit) no longer supports this logical. Instead, you must start the program as a DCL Foreign Command and then pass the desired
port on the command line like so:
...snip $ def/user/NOlog sys$input tt $ if f$getsyi("arch_name") .eqs. "VAX" $ then $ def/user/NOlog KER$COMM 'dev_name' $ run csmis$exe:vms_kermit_33117.exe ! kermit-32 $ else $ ckermit == "$csmis$exe:CKV196-AXP-VMS72-NONET.EXE" $ ckermit -l 'dev_name' $ endif
Machine | Memory | CPUs | OS | Boot Time | Storage | Avg Disk I/Os ($mon disk) |
Max Disk I/Os ($mon disk) |
---|---|---|---|---|---|---|---|
VAX-6430 manufactured: 1989 |
256M | 3 | OpenVMS-7.2 | 11.5 min | 2 DSSI busses 2 StorageWorks boxes 2 HSD05 adapters 8 RZ26 drives 4 shadow sets (across 2 busses) |
23 | 32 |
AlphaServer-4100 (EV5@300MHz) manufactured: 1996 |
512M | 2 | OpenVMS-7.2-1 | < 2 min | 2 Mylex DAC960 24 RZ29 drives 4 RAID-5 sets 1 SCSI adapter 1 StorageWorks box 2 RZ29 drives |
312 | 610 |
Our used AlphaServer 4100s were delivered without any built-in tape storage devices and we need to have daily backups of our database. I located a neat "4 mm DAT" ( DS-TLZ10-VA ) which plugs into one slot of our StorageWorks box (Apparently, any device ending in "-VA" can plug into a StorageWorks box) . I ordered one, then installed it while the system was running using the following command:
$ mcr sysman SYSMAN> io autoconfig SYSMAN> exit $
Very fast...
After we cutover our application to the AlphaServer-4100, we left our two VAXs (one production VAX-6430 and one DRP VAX-6410) powered up and connected to the corporate network incase we neglected to copy something or needed to cut back for some reason. Well, the cutover was four weeks ago and now it was time to decommission the VAX's.
As the machines were rolled out of our computer room, I decided to remove the gray plastic "Digital" name plate from the front door as well as the very cool digital-branded chrome-plated door key as keep sakes (they now sit on my desk; I intended to hang the plastic logo on my key chain but can't bear to drill the hole). I had installed these machines when Digital Equipment Corporation was still a company and this is truly the end of an era for me.
p.s. This happened the day after HP and Compaq announced they'll merge into the New-HP. Since HP is considered an engineer's company (I've always thought of HP's Bill Hewlett and David Packard as the same kind of people as Digital's Ken Olsen and Gordon Bell), let's hope that the Digital Equipment division of Compaq has found a better home.
1000 option type=explicit !
declare long i% !
for i% = 1 to 100 ! should be "for i% = 1% to 100%" on VAX; Alpha doesn't care
print i% !
next i% !
end program 1 ! return -s- to DCL
Compaq-BASIC for VAX (a.k.a. VAX-BASIC) will generate floats for these numbers then will convert them to longs at "run
time" before using them.
Compaq-BASIC for Alpha is smart enough to realize that longs are required and so builds longs at "compile time".
I've personally wasted many months of my life make sure that percent symbols are located everywhere they're supposed to be
along with a lot of other stuff. Since software is supposed to assist us, features like these are a welcome relief.
So-called "DEC languages" targeted at Alpha and Itanium are based upon the GEM Optimizing Compiler System.
GEM is a project code-name rather than an acronym. Everything coming out of DEC in those days had names like GEM, Emerald,
Opal, Prism, Mica, etc.
A Few GEM links:
Management has determined that we've earned our wings with the used Alphas and has decided to replace our primary "Alpha Server 4100" with a brand new "Alpha Server DS20e". BTW, there was no performance reason to change; the AS-4100 will become our DRP (hot standby) machine located in another building.
The new machine is a rocket but I can't post any stats yet because we haven't yet cut over our application software and customer data. But check out the basic differences in the following chart.
Machine | CPUs | Memory | RAID5 | Ethernet | FDDI1 | VGA2 | average SETI work unit time |
---|---|---|---|---|---|---|---|
AS-4100 | 2 @ 300 MHz | 0512 MB | 2 @ DAC-960 (Mylex) | 1 | 1 | 1 | 15 hours/CPU |
AS-DS20e | 2 @ 833 MHz | 1000 MB | RA-3000 (HSZ-22)3 | 2 (100Mb) | 1 | 0 | 4 hours/CPU |
Superscript Notes:
>>> set eia0_mode twisted
AlphaServer DS20 Console Manuals:
2008-06-17 Update: Our company runs two networks so...
>>> set eia1_mode auto-negotiateand is currently running 100 Mb/s full-duplex
Switched the caching policy of our RA-3000 (raid controller) from write-through to write-back. System performance is now "scary fast"