[comp.sys.att] V30 PC6300 upgrades

zz1ml@sdcc3.ucsd.EDU (Mick Laver) (02/10/88)

Several months ago there was a LOT of traffic here about upgrading
6300's with NEC V30's. I'm considering this path, but I seem to
remember a lot of conflicting claims. If anyone would like to
respond to me regarding the following questions, I post a followup.

1.  What sort of performance increase should one expect? Where have
    or have not you seen a difference?

2.  Is a ROM upgrade for older 6300's necessary? If so, what version
    do you need, and how do you find out what version you have?

3.  Any other gotchas to be wary of?
-- 
Mick Laver, C-010                 Internet:  laver@sdcsvax.ucsd.edu
UCSD Academic Computing Center    UUCP:     ...!sdcsvax!sdcc3!zz1ml
La Jolla, CA.92093                BITNET:         laver@ucsd.BITNET 

wtm@neoucom.UUCP (Bill Mayhew) (02/16/88)

Here are some results that I got.  I didn't feel like disassembling
my AT&T to put the V-30 back in, so I only quote the V-30 results.

Benchmarked with pi.c arctan series method (see below):

To calculate 1st 5000 digits of pi.

IBM PS/2 mod 80 SCO Xenix 2.2 cc -O:			0:15:38
IBM PS/2 mod 80 DOS 3.3 TC 1.5 large model:		0:16:02
Epson Equity III 8 MHz DOS 3.2 TC1.5 large model:	0:29:32
VAX 11/750 BSD 4.2 cc -O:				0:59:22
AT&T 6300 V-30, 8087 MSDOS 3.2 TC 1.5 large model:	1:09:02
AT&T 6300 V-30 no 8087:					same
AT&T Unix PC, 2 meg, cc -O Unix release 3.51:		1:53:18

The MSDOS results were obtained using the MKS Tooklits /bin/time
program from ksh:  /bin/time "./pi -5000 >/dev/nul"  The same form
was used for Unix/Xenix.  In Xenix, I used csh to run the command,
since ksh was not available.  Note that it appears that SCO Xenix
does not use the 80387, eventhogh one is installed.  I determined
that a 16 bit int divide requires 0.4 uS.  A double real divide
requires about 85 uS (!!).  They probably don't use the 80387 since
it maps into an interrupt that would interfere wit disk DMA if a
floating point exception occurs-- definitely not a good thing for a
multitasking environment.  IBM engineering strikes again.  I hope
to give the pi calculation a try on a AT&T Tower '386 (still a
prototype) in the next few days.

/*
** NAME
**	pi -- a program to calculate the value of pi
**
** SYNOPSIS
**        pi {-}digits {t}
**
** DESCRIPTION
**	Pi calculates the value of pi to the number of digits
**	specified. Output is to the standard output, if the
**	digits specifed is negative, output is formatted
**	for attractive display on an 80col printer.
**
**	The optional last argument "t" enables timing of the
**	computational loop. The pitime() function must be supplied
**	by the individual site implimentation.
**
**	This is an adaptation in C of the BASIC program "Apple Pi"
**	by Robert J. Bishop, published in Micro Apple (c) 1981
**	Micro Ink, Inc. That program, when run on an Apple II,
**	took 40 hours to solve pi to 1000 places. Arrays of digits
**	are used to impliment extended precision arithmatic. The
**	program solves pi using the series expansion:
**
**	      infinity                    infinity
**	      ____  16*(-1e(k+1))         ____  4*(-1e(k+1))
**	      \                           \
**	pi =   >    -------------    -     >    ------------
**	      /                           /
**	      ----  (2k-1)*5e(2k-1)       ----  (2k-1)*239e(2k-1)
**	      k = 1                       k = 1
**
** AUTHOR
**	Bryan Costales ( ...!dual!ptsfa!ski!eeg!bcx )
**	pi.c (c) 1985 Bryan Costales
**
** BUGS
**	
*/
 
 
#include <stdio.h>
 
/*
 * The maximum number of digits (plus 5 for rounding).
 */
#define MAX 100005
 
/*
 * Global variables
 */
int 	Sign, 
	Zero, 
	Size, 
 	Pass,	/* two passes */
	Exp,	/* exponent for divide */
	Divide; 
 
/*
 * These character arrays represent the digits for extended
 * precision arithmatic. (These may need to be int on some machines).
 */
#define DIGIT char
DIGIT Power[MAX], Term[MAX], Result[MAX];
 
main(argc, argv)
int  argc;
char *argv[];
{
	static int constant[3]={0,25,239};
	register int i;
	int charcount, printer = 0;
	void exit();	/* for lint */
 
	if(argc == 1)
	{
		(void)fprintf(stderr,"usage: pi {-}digits {t}\n");
		exit(1);
	}
 
	Size = atoi(argv[1]);
	if(Size < 0)
	{
		Size = -Size;
		printer++;
	}
 
	if(Size >= MAX-4 || Size <= 0)
	{
		(void)fprintf(stderr,"'digits' must be 1 thru %d.\n",MAX-5);
		exit(1);
	}
 
	if( (argc==3) && (*argv[2]=='t') )
	{
		(void)fprintf(stderr,"start computation: ");
		pitime();
	}
 
	for(Pass=1; Pass < 3; Pass++)
	{
		init();
 
		do
		{
			copy();
			Divide = Exp;
			div(Term);
			if ( Sign > 0 ) 
				add();
			if ( Sign < 0 ) 
				sub();
			Exp = Exp + 2;
			Sign *= -1;
			Divide = constant[Pass];
			div(Power);
			if (Pass == 2) 
				div(Power);
		} while( Zero != 0 );
	}
 
	if( (argc == 3) && (*argv[2] == 't') )
	{
		(void)fprintf(stderr,"end computation:   ");
		pitime();
	}
 
	if( printer )
	{
		(void)printf("\t\tThe value of pi" );
		(void)printf(" to %d decimal places\n\n\t\t",Size);
	}
 
	(void)printf("%d.",Result[0]);
	charcount = 0;
 
	for(i = 1; i <= Size; i++)
	{
		(void)printf( "%d", Result[i]);
		charcount++;
		if ( (charcount == 50) && printer )
		{
			(void)printf( "\n\t\t  " );
			charcount = 0;
		}
	}
	(void)printf( "\n" );
	return( 0 );	/* for lint */
}
 
add()
{
	register DIGIT *r, *t;
	register int sum, carry = 0;
    
	r = Result + Size;
	t = Term + Size;
 
	while( r >= Result )
	{
		sum = *r + *t + carry;
		carry = 0;
		if( sum >= 10 )
		{
			sum -= 10;
			carry++;
		}
		*r-- = sum;
		--t;
	}
}
 
sub()
{
	register DIGIT *r, *t;
	register int diff, loan = 0;		
	
	r = Result + Size;
	t = Term + Size;
 
	while( r >= Result )
	{
		diff = *r - *t - loan;
		loan =0;
		if( diff < 0 )
		{
			diff += 10;
			loan++;
		}
		*r-- = diff;
		--t;
	}
}
 
div(array)
register DIGIT *array;
{
	register DIGIT *end;
	register int quotient, residue, digit = 0;
 
	Zero = 0;
 
	for( end = array + Size; array <= end; )
	{
		digit    += *array;
		quotient =  digit / Divide;
		residue  =  digit % Divide;
 
		if((Zero !=0) || ((quotient+residue) != 0)) 
			Zero = 1;
		else 
			Zero = 0;
 
		*array++ = quotient;
		digit = 10 * residue;
	}
}
		
init()
{
	register DIGIT *p, *t, *r, *end;
 
	p = Power;
	t = Term;
	r = Result;
	end = Power+Size;
 
	while( p <= end )
	{
		*p++ = 0;
		*t++ = 0;
 
		if (Pass == 1) 
			*r++ = 0;
	}
 
	*Power = 16 / (Pass * Pass);
 
	if( Pass == 1 ) 
	{
		Divide = 5;
	}
	else
	{
		Divide = 239;
	}
 
	div(Power);
	Exp = 1;
	Sign = 3 - (2 * Pass);
}
 
copy()
{
	register DIGIT *t, *p, *end;
 
	t = Term;
	p = Power;
	end = Term + Size;
	
	while (t <= end)
	{
		*t++ = *p++;
	}
}
 
pitime()
{
	/* Print the current time \n */
 
	/* Here we just beep */
	(void)fprintf( stderr, "%c\n", 0x07 );
}