|
Our
"skunk works" has just (1999-11-30) received an AlphaServer 4100s (with
DUNIX 4.1 installed) from a cancelled project and we've been
commissioned to port a relatively large app from a dual VAX-8550 cluster to
Alpha.
This specific machine is an AlphaServer 4100 5/300 which was manufactured in 1996. It contains 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.
We ordered the complete "OpenVMS for Alpha" software distribution library (24 CD-ROMS for just under $1K Canadian) so we'll be prepared when we receive our temporary licenses from Compaq/HP.
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 (and then HP-BASIC)
Compiling large (40K line) programs takes an unbelievable amount of resources and time. The release notes state that this is due to the optimizer which defaults to the highest setting of 4.
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, I can only imagine what the compiler now has to do when generating instructions for a pipelined super scalar 64 bit RISC CPU
- 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 to a new hardware architecture will always be safe. Everything has worked properly so far but I keep thinking that 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) option type=explicit record QuadWord long long0 long long1 end record external long function sys$bintim ! informal 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 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 b = a / 0 ! optimizer removes this first 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:
$ type pos_spnnnnnnn.bas 1000 option type=explicit map(abc) string dev_name$ = 8 ! fixed length string dev_name$ = "LTA9999" if pos(dev_name$,":",1%)>0% then dev_name$ = dev_name$ +":" ! the problem line !~~~ dev_name$ = edit$(dev_name$,128%) +":" x the fixed line end if print dev_name$ 30000 end $ bas/optim=level=0/warn=all pos_demo 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 $ bas/optim=level=1/warn=all pos_demo $ ! no informational
More Non-sense Code
$ type logic_demo.bas 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 print "error: ";rc% end if 30000 end $ bas/optim=level=0/warn=all logic_demo <-- produces no messages $ bas/optim=level=1/warn=all logic_demo 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.
Despite the fact that many system calls were done in both VAX-BASIC and VAX-C, it has been much easier to port BASIC than "C". This seems a little strange to me since "C" is considered the favorite porting tool of industry. Perhaps things would have gone a bit better if our "C" source code had been kept up to date with newer versions of the DEC-C compiler which had been available on VAX for a least 7 years. On a different note, I now believe that porting COBOL and FORTRAN apps would probably be just as easy as porting BASIC.
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...
- starts with a trial port of two large VAX-BASIC apps (with system calls sys$crmpsc and sys$mgblsc) previously running under VMS 6.2 (dorking around with these new calls took up more time then I expected)
- finished with a port of ~200 VAX-BASIC apps and ~10 VAX-C apps previously running under VMS 5.5-2
- more time than usual was spent renovating VAX-C programs to run under DEC-C (if ongoing code maintenance had been done on these apps then this wouldn't have been necessary)
- total work time was one person working <8 weeks in my spare time
| 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 |
- Intel drove away many industrial customers when it brought out its patented "SLOT 1" and "SLOT 2" interface technology accompanied by sky-high royalty fees
Note: "SLOT 1" is for non-Celeron Pentium-II (and up) while "SLOT 2" is for Xeon class Pentiums used in servers.- Compaq countered by bringing out patented "SLOT A" and "SLOT B" technology accompanied by very low royalty fees. (check out AMD's Athlon product)
- Compaq needed to drop the cost of Alpha chips as well as get a foot hold on the Pacific rim so they signed deals with both Samsung Semiconductor and Mitsubishi to produce second source components
- Compaq and Samsung joined together to form an alliance which will produce Alpha systems and motherboards. The name of this company is API (Alpha Processor Inc.) and their web address is www.alpha-processor.com I should point out that API only deals in Linux and Tru64 solutions, not OpenVMS.
Oops! API went of of business in 2002-04 after Compaq sold the Alpha design to Intel and Samsung ended their funding of API- Compaq recently asked IBM to produce a copper Alpha to get the clock speed over 1 GHz and IBM succeeded (is this IBM's revenge on the Wintel alliance?)
- Alpha technology has been on the scene since 1992 which means it's had a 10 year jump on Itanium. If Compaq keeps the price down and continues to advance the technology, Itanium may become a foot note in history just like the Intel iAPX-432 which was cancelled in 1983.
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 h71000.www7.hp.com/freeware/freeware40/macro64/ 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 xref3 |
.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 xref4 |
.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:
01. Instruction Issue Rate: Integer only vs. (Integer + Float)
02. OOE = Out of Order Execution
03. OCL2 = On Chip Level 2 Cache
04. OCMC = On Chip Memory Controller
05. SMP = Symmetric Multi Processing
06. SMT = Simultaneous Multi Threaded (chip level)
07. "A" and "B" series parts are usually just a "die shrink" with
the exception of EV56 which also had an "instruction set" extension
08. 21066, 21066A, and 21164PC (PCA56) are not shown
09. EV6 and EV7 have the same CPU core
10. Cancelled on June 25, 2001 when Compaq announced that they had
been seduced by the dark side (Intel's IA-64)
| Digital Technical Journal - Index | |
| Digital Technical Journal Volume 4, Number 4, Special Issue 1992 | - describes the 21064 (EV4) |
| Digital Technical Journal Volume 6, Number 1, Winter 1994 | - evolution of 21066 (AXP PC) |
| Digital Technical Journal Volume 6, Number 2, Spring 1994 | - evaluation kit for the 21064 |
| Digital Technical Journal Volume 7, Number 1, Special Edition 1995 | - describes the
21164 (EV5) - AlphaServer 2100 systems |
| Digital Technical Journal Volume 8, Number 4 | - describes the
AlphaServer 4100 - Instruction Execution on Alpha Processors |
| http://www.hpl.hp.com/hpjournal/dtj/ | - raw list of documents |
| http://www.hpl.hp.com/techreports/Compaq-DEC/ | - list of Compaq Publications |
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 Alpha Server 4100 5/300. Documents behind the links above say the VAX-6430 has a PERF rating of 125 while the Alpha Server-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 because all the ones I've seen have
directory "\utility\swxcsr" which contains the RCU (Raid
Configuration Utility) as well a RAID module firmware. Check out the
following link for more firmware: http://ftp.digital.com/pub/Digital/Alpha/firmware/ |
| Kermit2 | async interface software (for use
where $SET HOST/DTE won't do) new versions are available at www.columbia.edu/kermit |
Superscript Notes:
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 the logical "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: 1989256M 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)1
manufactured: 1996512M 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 drives312 610 Superscript Notes:
1. a new AlphaServer with EV68 (or 69) technology would make this Alpha look like a VAX (and the VAX look like a PDP)
Our used AlphaServer 4100s were delivered without any built-in tape storage devices and we need to have daily backups of our database. Using this link I found 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 cool (and 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 (with temporary addresses) 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 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. Who knows; maybe Carly Fiorina will revive the Alpha Microprocessor Division.
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 a 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-negotiate
and is currently running 100 Mb/s full-duplex
| Caveat: although there is a detailed layout diagram attached to the inside cover, do not attempt this yourself without the original manual. Also, the technician doing the job must use one, or more, anti-static straps and must be qualified to work on very high density CMOS; the memory area is tight and you must take care not to break the extra long DIMM sockets; Before you order any memory chips, check if you have any spare sockets and remember that you can't pop the lid to peek at the motherboard while the system is running because a magnetic interlock will shut down your internal power supplies. |
| Criticism targeted at so-called PC technicians: "Why don't you people use anti-static straps?". Just because a system seems to work properly after your work is finished doesn't mean that a small static discharge from your body hasn't weakened a component which will now fail within a few months. |
Click
for the latest reality check from our hero |
![]() Previous SkipPrevious SkipNext Next List Random Next5 |
Back
to
OpenVMS
Back
to
Home
Neil Rieck
Kitchener - Waterloo - Cambridge, Ontario, Canada.