[comp.arch] gather/scatter hardware

levisonm@qucis.queensu.CA (Mark Levison) (03/20/89)

     Does anyone have a good short explanation of how gather/scatter
hardware (such as in the Cray - XMP) works?

Thanks in advance                     |  #include <std/disclaimer.h>
Mark Levison                          |
internet: levisonm@qucis.queensu.ca   |
bitnet:   levisonm@qucis.bitnet       |
snail mail: 366 Albert St             |
            Kingston, Ont.            |
            Canada                    |
            K7l 3V9                   |

brooks@vette.llnl.gov (Eugene Brooks) (03/23/89)

In article <180@qusunj.queensu.CA> levisonm@qucis.queensu.CA (Mark Levison) writes:
>
>     Does anyone have a good short explanation of how gather/scatter
>hardware (such as in the Cray - XMP) works?
You have a vector of integers which are interpreted as addresses,
or indexes for a fixed array address and you crank these through a pipe
which issues loads or stores using another vector register as the source
or destination operand.  A very useful capability for some applications.


brooks@maddog.llnl.gov, brooks@maddog.uucp, .../uunet!maddog.llnl.gov!brooks

davidsen@steinmetz.ge.com (Wm. E. Davidsen Jr) (03/23/89)

In article <180@qusunj.queensu.CA> levisonm@qucis.queensu.CA (Mark Levison) writes:
| 
|      Does anyone have a good short explanation of how gather/scatter
| hardware (such as in the Cray - XMP) works?

How about a short description of scatter/gather, not based on the XMP?
The basis of s/g is that hardware in the system will take a mass storage
address, meaning controller id, pgysical unit id, cylinder and head, and
the *address* of a list of trasfer control instructions. Each
instruction contains the starting address of a buffer and (usually) the
size of the buffer.

Example:
; Code fragment
	DO_IO	DEVLIST,BUFLIST
	WAIT
	JNZ	error
; More code here

;
; Data area
;
DEVLIST EQU	*
	DB	0		; Disk string
	DB	?		; Device number
	DB	?		; Head
	DW	?		; Cylinder

BUFLIST	EQU	*
	IOTC	HEADER,77	; Header info
	IOTC	P1,?		; Prefix buffer, fill in length
	IOTC	BODY,410	; 410 bytes of body
	IOTC	S1,?		; Suffix, 2 or 7 bytes
	IOTD	TAIL,22		; record tail
________________________________________________________________

On a disk the total size better be a multiple of the sector size, but on
a tape the record length can vary. The example transfers data from five
places in memory to one output record.

I borrowed the i/o mnemonics from the Honeywell 6000, I/O Transfer and
Continue, I/O Transfer and Disconnect. I believe that there was a way to
read in one i/o control word as the first word of the record, and use
that to determine the destination of the rest of the record. The lengths
were actually in words.

Something loosely like:
IOLST:	IOTC	*+1,1		; Read the control info
	BSS	1		; First word is an IOTD

I *think* there was an I/O control word to transfer from one list to
another, which may have been called TDCW (Transfer to Data Control
Word). Probably other people have programmed that machine more recently
than I and can clarify the facts.

================================================================
New mailing address: wedu@crd.ge.com

We are no longer ge-crd.arpa and mail will stop working to that address
in the *very* near future.

Note: flames and hate mail may still use the old address ;-{
================================================================
We now return you to our regularly scheduled signature...

-- 
	bill davidsen		(wedu@crd.GE.COM)
  {uunet | philabs}!steinmetz!crdos1!davidsen
"Stupidity, like virtue, is its own reward" -me