?_éÿÿÿÿDÙÐl!ËÊ4(Parallel Virtual Machine (PVM) 3.4 HELPBrowseButtons()ZmainmainParallel Virtual Machine (PVM) 3.4 HELP  /&;)z4ÿÿ \ ÿÿÿÿDOUGHBOY.WMF®PVM.WMF‘+|CONTEXTÔ|CTXOMAPl·|FONT‚µ|KWBTREE±·|KWDATAw·|KWMAP ·|SYSTEM|TOPIC|TTLBTREEà»|bm0>Ü|bm1+æj°a°ÿÿÿÿ = ÿÿÿÿI1ÿÿÿÿ€I{PIntroduction2 {# €€€‚ÿIntroduction&I¡# €€€‚ÿD {å8 @€€€‚‚‚€†"€€‚‚‚‚ÿ(¡ $ €€€‚‚ÿæåóI `€;€€€€‚‚€‚ãñnõ‰ã}$á‰ã›®tö‰ã Ùµ-‰‚‚ÿParallel Virtual Machine (PVM) Version 3.4Check out PVM Intro or pvm console or pvmd3 daemon or libpvm3, libfpvm3 library for an overview.ýÔ ð) €©€dCP È:‚H€‚‚ÿAny comments on our project, bug reports and hints are welcome. You can contact us at pvm@msr.epm.ornl.gov or you can find us on the internet by browsing for latest information to http://www.epm.ornl.gov/pvm.(ó$ €€€‚‚ÿ8ðP& €$€€€‚ÿYour PVM Team.: Š1Ê ÿÿÿÿ抹j„PVM Intro/ P¹# €€€‚ÿPVM IntroB Šû7 >€€€‚‚‚‚€†"€€‚‚ÿ‰H¹„A P€‘€€‚‚‚€€€‚‚€€‚‚‚ã Ùµ-‰‚ÿParallel Virtual Machine (PVM) Version 3.4DESCRIPTIONPVM is a software system that enables a collection of heterogeneous computers to be used as a coherent and flexible concurrent computational resource. The individual computers may be shared- or local-memory multiprocessors, vector supercomputers, specialized graphics engines, or scalar workstations, that may be interconnected by a variety of networks, such as ethernet, FDDI.User programs written in C, C++ or Fortran access PVM through library routines (libpvm3.a and libfpvm3.a libpvm3, libfpvm3 library ). Ïû: B€Ÿ€€‚ã›®tö‰‚‚€€‚‚ƒ‚ƒ‚ƒ‚ÿDaemon programs (pvmd3 daemon) provide communication and process control between computers.MACHINE ARCHITECTUREIn the PVM system, machines are assigned a short string to identify their architectures (this includes operating system type as well as CPU type). The types currently predefined in the distribution are: AFX8 Alliant FX/8 ALPHA DEC Alpha/OSF-1 ALPHAMP DEC Alpha/OSF-1 / using shared memoryå„¥ 3 4€Ë€€ƒ‚ƒ‚ƒ‚‚ƒ‚ƒ‚ƒ‚‚ƒ‚ÿ AIX46K IBM/RS6000 / AIX 4.x AIX4MP IBM SMP / shared memory transport / AIX 4.x AIX4SP2 IBM SP-2 / using MPI / AIX 4.x APOLLO HP 300 running Domain/OS ATT AT&T/NCR 3600 running SysVR4 BAL Sequent Balance BFLY BBN Butterfly TC2000 BSD386 80[345]86 running BSDI or BSD386 CM2 Thinking Machines CM-2 Sun front-end Ó° 8 >€§€€ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ÿ CM5 Thinking Machines CM-5 CNVX Convex using IEEE floating-point CNVXN Convex using native f.p. CRAY Cray CRAY2 Cray-2 CRAYSMP Cray S-MP CSPP Convex Exemplar DGAV Data General Aviion E88K Encore 88000 FREEBSD 80[345]86 running FreeBSD HP300 HP 9000 68000 cpu-ô¥ Ý9 @€é€€ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ÿ HPPA HP 9000 PA-Risc HPPAMP HP 9000 PA-Risc / shared memory transport KSR1 Kendall Square I860 Intel RX Hypercube IPSC2 Intel IPSC/2 LINUX 80[3456]86 running Linux M88K Motorola M88100 running Real/IX M88K Motorola M88100 running Real/IX MASPAR Maspar MIPS Mips NETBSDAMIGA Amiga running NetBSDϰ ï@7 <€Ÿ€€ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ÿ NETBSDHP300 HP 300 running NetBSD NETBSDI386 80[345]86 running NetBSD NETBSDMAC68K Macintosh running NetBSD NETBSDPMAX DEC Pmax running NetBSD NETBSDSPARC Sparc running Ýï@PNetBSD NETBSDSUN3 SUN 3 running NetBSD NEXT NeXT PGON Intel Paragon PMAX DEC/Mips arch (3100, 5000, etc.) RS6K IBM/RS6000 / AIX 3.x#ðÝC3 4€á€€ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ÿ RS6KMP IBM SMP / shared memory transport / AIX 3.x RT IBM/RT SCO 80[345]86 running SCO Unix SGI Silicon Graphics IRIS SGI5 Silicon Graphics IRIS running OS >= 5.0 SGI64 Silicon Graphics IRIS running OS >= 6.0 SGIMP Silicon Graphics IRIS / OS 5.x / using shared memory SGIMP64 Silicon Graphics IRIS / OS 6.x / using shared memory&îï@8E8 >€Ý€€ƒ‚ƒ‚ƒ‚ƒ‚‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ÿ SP2MPI IBM SP-2 / using MPI / AIX 3.x SUN3 Sun 3 SUN4 Sun 4, 4c, sparc, etc. SUN4SOL2 Sun 4 running Solaris 2.x SUNMP Sun 4 / using shared memory / Solaris 2.x SX3 NEC SX-3 SYMM Sequent Symmetry TITN Stardent Titan U370 IBM 3090 running AIX UTS2 Amdahl running UTS UVAX DEC/Microvax*ùCbG1 0€ó€€ƒ‚ƒ‚ƒ‚ƒƒ‚‚‚‚‚‚ÿ UXPM Fujitsu running UXP/M VCM2 Thinking Machines CM-2 Vax front-end X86SOL2 80[345]86 running Solaris 2.x WIN32PC's running Windows95 or NT (Intel, Alpha)ENVIRONMENT VARIABLES PVM_ROOT The path where PVM libraries and system programs are installed, for example /usr/local/pvm3 or $HOME/pvm3. This variable must be set on each host where PVM is used in order for PVM to function. There is no default value.Õ8EcK, &€«€€‚‚‚‚‚‚‚‚‚ÿ PVM_EXPORT Names of environment variables to export from a parent task to children tasks through (). Multiple names must be separated by ':'. If PVM_EXPORT is not set, no environment is exported. PVM_DEBUGGER The debugger script to use when pvm_spawn is called with PvmTaskDebug set. The default is $PVM_ROOT/lib/debugger. PVM_DPATH [v3.3.2 and later] The path of the pvmd startup script (default is $PVM_ROOT/lib/pvmd). It is overridden by host file option dx=. This variable is useful if you use a shell that doesn't automatically execute a startup script (such as .cshrc) to allow setting PVM_ROOT on slave (added) hosts. If you set it to the absolute or relative path of the pvmd startup script (for example /usr/local/pvm3/lib/pvmd or pvm3/lib/pvmd), the script will automatically set PVM_ROOT. Note that for this to work, you must set it to run the pvmd script, not the pvmd3 executable itself.ôÈbGWN, &€‘€€‚‚‚‚‚‚‚‚‚ÿ PVMDLOGMAX [v3.3.8 and later] Sets the maximum length of the pvmd error log file. Default value is the PVMDLOGMAX parameter in the source, 1 Mbyte. PVMDDEBUG [v3.3.8 and later] Sets the default pvmd debugging mask (as does the pvmd -d option). Value can be in hexadecimal (0x...), octal (0...) or decimal. Used to debug the pvmd (not intended to be used to debug application programs). PVMTASKDEBUG [v3.3.8 and later] Sets the default libpvm debugging mask (as does pvm_setopt(PvmDebugMask, x)). Value can be in hexadecimal (0x...), octal (0...) or decimal. Used to debug libpvm (not intended to be used to debug application programs).ϦcK2) €M€€‚‚‚‚‚‚ÿ PVMBUFSIZE Sets the size of the shared memory buffers used by libpvm and the pvmd. The default value is 1048576. If your program composes messages longer than this size, you must increase it. PVMKEY PVM uses this value, combined with the process id, to generate shared-memory segment keys. The default value is your numeric uid. PVM automWN2Patically detects collisions when generating a key and picks a new key, so it should almost never need to be set explicitly. The following environment variables are used by PVM internally. With the exception of PVM_ARCH, their values should not be modified. This is for information only.¤yWNÖƒ+ $€ó€€‚‚‚‚‚‚‚‚ÿ PVM_ARCH The PVM architecture name of the host on which it is set, used to distinguish between machines with different executable (a.out) formats. Copies of a program for different architectures are installed in parallel directories named for PVM architectures. PVMSOCK Is passed from pvmd to spawned task, and gives the address of the pvmd local socket. PVMEPID Holds the expected process id of a spawned task exec'd by the pvmd. This is a magic cookie used by the task to identify itself when reconnecting to the pvmd, in order to get the correct task slot.”m2j„' €Ú€€‚‚‚‚‚ÿ PVMTMASK [v3.3 and later] The libpvm trace mask, passed from the pvmd to spawned tasks.< Öƒ¦„1M ª€¦„ׄÿÀpvm console1j„ׄ# €€€‚ÿpvm console—b¦„n‡5 8€Å€€€‚‚‚‚‚‚€€‚‚‚ÿpvm PVM version 3 consoleSYNOPSISpvm [ -options ] [ hostfile ]DESCRIPTIONPvm is a stand alone PVM task which allows the user to interactively query and modify the virtual machine. The console can be started and stopped multiple times on any of the hosts in the virtual machine without affecting PVM or any applications that may be running. When started pvm determines if PVM is already running and if not automatically executes pvmd3 on this host, passing pvmd3 the command line options and host file. Thus PVM need not be running to start the console. Once started the console prints the prompt:4öׄ¢‰> J€í€€‚ƒ‚‚‚‚ƒ‚ƒƒ‚ƒƒ‚ƒ‚ƒƒ‚ƒƒ‚ƒƒ‚ƒ‚ÿpvm>The following console commands are available: add hostname(s) Add hosts to virtual machine alias Define/list command aliases conf List virtual machine configuration delete hostname(s) Delete hosts from virtual machine echo Echo arguments export Add environment variables to spawn export list halt Stop pvmds help [command] Print helpful information about a command Ën‡¬‹? L€—€€ƒƒ‚ƒƒ‚ƒƒ‚ƒ‚ƒƒ‚ƒƒ‚ƒƒ‚ƒƒ‚ƒƒ‚ƒ‚ÿ id Print console task id jobs List running jobs kill task-tid Terminate tasks mstat host, tid Show status of hosts ps -a List all PVM tasks pstat task-tid Show status of tasks quit Exit console reset Kill all tasks setenv Display/set environment variables sig signum task Send signal to taskߢ‰Ä9 @€¿€€ƒ‚ƒ‚ƒƒ‚ƒƒ‚ƒƒ‚ƒ‚ƒ‚ƒ‚ƒƒ‚ÿ spawn [opt] a.out Spawn task opts are: -(count) number of tasks, default is 1 -(host) spawn on host, default is any -(ARCH) spawn on hosts of ARCH -? enable debugging -> redirect task output to console -> file redirect task output to file ->>file redirect task output append to file trace Set/display trace event maskѬ‹Õ@ N€£€€ƒƒ‚ƒƒ‚ƒƒ‚‚‚‚‚‚‚‚‚‚€€‚ƒ‚‚‚ÿ unexport Remove environment variables from spawn export list unalias Undefine command alias version Show libpvm versionpvm reads $HOME/.pvmrc before reading commands from the tty, so it can be used to customize the console environment, for example: alias ? help alias j jobs setenv PVM_EXPORT DISPLAY # print my id echo new pvm shell idEXAMPLESpvmStarts up pvmd3 on the local host or connects to running pvmd3.åÄÿÀ9 @€Ë€€‚ƒ‚‚‚‚‚ãÕÿÀj„ñnõ‰‚ã›®tö‰‚‚ÿpvm d:\users\fischer\pvmhostfile.txtStarts up console and pvmd3, which inturn reads the host file and adds the listed computers to the virtual machine. ( full path required on WIN32 )see alsoPVM Intropvmd3 daemon= Õ<Á1³)æz‰<ÁnÁ´Jpvmd3 daemon2ÿÀnÁ# €€€‚ÿpvmd3 daemon$ï<Á’Ã5 8€ß€€€‚‚‚‚‚‚€€‚‚‚ÿpvmd, pvmd3 PVM daemonSYNOPSISpvmd [ -options] [ hostfile ] &DESCRIPTIONPvmd3 is a daemon process which coordinates unix hosts in a virtual machine. One pvmd3 must run on each host in the group. They provide the communication and process control functions needed by the user's PVM processes. The daemon can be started manually with a host file argument that will automatically start the remote pvmds. The local and remote pvmds can also be started from the PVM console program pvm.v>nÁÆ8 >€}€€‚‚‚‚€€‚‚‚€€‚‚ÿThe name of the daemon executable is pvmd3. It is usually started by a shell script, %PVM_ROOT%/lib/pvmd.[v3.4 and later] Before running pvmd3, pvmd sources any commands in $HOME/.pvmprofile if this file exists.OPTIONSThe following options may be specified on the command line when starting the master pvmd or PVM console:-dmask Set pvmd debug mask. Used to debug the pvmd or libpvm (not intended to be used to debug application programs). Mask is the sum of the following bits and can be specified in hexadecimal (0x...), octal (0...) or decimal:Î’à È7 <€€€ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ÿ Bit Information 0x1 Packet routing 0x2 Message routing and entry points 0x4 Task state 0x8 Slave pvmd startup 0x10 Host table updates 0x20 Select loop (below packet layer) 0x40 IP network 0x80 Multiprocessor nodes 0x100 Resource manager interface—^ƤÊ9 @€½€€ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚‚‚€€‚‚ÿ 0x200 Application (messages with no destination, etc.) 0x400 Wait contexts 0x800 Shared memory operations 0x1000 Semaphores 0x2000 Locks 0x4000 Message route control -nname Specify an alternate hostname for the master pvmd to use. Useful when gethostname() returns a name not assigned to any network interface. The following options are used by the master pvmd when starting slaves and are only of interest to someone writing a hoster. Don't just go using them, now.È ȪÌ> J€‘€€‚€€‚‚‚€€‚‚‚€€‚‚ÿ-s Start pvmd in slave mode. Hostfile cannot be used, five additional parameters must be supplied: master pvmd index, master IP, master MTU, slave pvmd index, and slave IP.-S Same as -s, but slave pvmd doesn't wait for its stdin to be closed after printing its parameters. Used for manual startup. -f Slave doesn't fork after configuration (useful if the slave is to be controlled or monitored by some process).Ú¤¤Ê6 :€I€€‚€€‚‚‚‚‚‚‚‚‚‚‚‚ÿHOST FILE FORMATEach host in the virtual machine must have an entry in the host file. Lines beginning with a splat ( # ), optionally preceded by whitespace, are ignored. A simple host file might look like: # my first host file thud fred wilma barney bettyThis specifies the names of five hosts to be configured in the virtual machine. The master pvmd for a group is started by hand on the localhost, and it starts slaves on each of the remaining hosts using the rsh or rexec command. The master host may appear on any line of the host file. Host names cannot be numeric (IP) addresses, because they are passed to rsh and rexec(), which usually don't accept addresses. The simple format above works fine iªÌÿÀf you have the same login name on all five machines and the name of the master host in your .rhosts files on the other four.LªÌÜ: B€%€€‚‚‚€€‚‚‚€€‚‚‚‚‚ÿThere are several host file options available:lo=NAME Specifies an alternate login name (NAME) to use. so=pw This is necessary when the remote host cannot trust the master. Causes the master pvmd to prompt for a password for the remote host in the tty of the pvmd (note you can't start the master using the console or background it when using this option) you will see:Password (honk.cs.utk.edu:manchek):you should type your password for the remote host. The startup will then continue as normal. Óå6 :€§€€‚‚€€‚‚‚€€‚‚ÿdx=FILE Specifies the path of the pvmd executable. FILE may be a simple filename, an absolute pathname, or a path relative to the user's home directory on the remote host. This is mainly useful to aid in debugging new versions of PVM, but may have other uses.ep=PATH Specifies a path for the pvmd to search for executable program components when spawning a new process. The path may have multiple elements, separated by colons ( : ).’?ÜwS t€€€‚€€‚‚‚€€‚‚‚€€‚‚‚€€‚€€€€‚ÿwd=PATH Specifies a working directory in which all spawned tasks on this host will execute.sp=VALUE Specifies the relative computational speed of this host compared to other hosts in the configuration. VALUE is an integer in the range [1 - 1000000] bx=PATH Specifies the debugger program path. Note: the environment variable PVM_DEBUGGER can also be set.ip=NAME Specifies an alternate IP address to use for the host. As with host names (when ip= is not used), the address must be a host name, not a numeric address, because it is passed to rsh and rexec(). This option allows one to pick a specific network interface for a machine without using the interface's name. It can also be used to create a virtual machine using symbolic (instead of actual) host names. ðå— 0 .€á€€‚€€‚‚‚‚‚‚ÿso=ms Rarely used. Causes the master pvmd to request user to manually perform the startup of a pvmd on a slave host when rsh and rexec network services are disabled but IP connectivity exists. See section "MANUAL STARTUP".A dollar sign ( $ ) in an option introduces a variable name, for example $PVM_ARCH Names are expanded from environment variables by each pvmd.Each of the flags above has a default value. These are: lo The loginname on the master host.d5wû / ,€k€€‚‚‚‚‚‚‚‚‚‚‚‚ÿ so Nothing dx $PVM_ROOT/lib/pvmd (or environment variable PVM_DPATH) ep $HOME/pvm3/bin/$PVM_ARCH:$PVM_ROOT/bin/$PVM_ARCH wd $HOME sp 1000 bx $PVM_ROOT/lib/debuggerYou can change these by adding a line with a star ( * ) in the first field followed by the options, for example: * lo=afriend so=pwThis sets new default values for 'lo' and 'so' for the remainder of the host file, or until the next '*' line. Options set on the last '*' line also apply to hosts added dynamically using pvm_addhosts(). Host options can be set without starting the hosts automatically. Information on host file lines beginning with '&' is stored, but the hosts are not started until added using pvm_addhosts().4— ;@0 .€ €€‚‚‚‚‚‚‚‚‚‚‚‚‚ÿExample host file: # host file for testing on various platforms fonebone refuge # installed in /usr/local here sigi.cs dx=/usr/local/pvm3/lib/pvmd # borrowed accts, "guest", don't trust fonebone * lo=guest so=pw sn666.jrandom.com cubie.misc.edu # really painful one, must start it by hand and share a homedir & igor.firewall.comû ;@ÿÀ lo=guest2 so=ms ep=bob/pvm3/bin/$PVM_ARCHáû OB3 4€Ã€€‚€‚‚‚‚‚‚‚‚‚‚‚‚ÿMANUAL STARTUPWhen adding a host with this option set you will see on the tty of the pvmd: *** Manual startup *** Login to "honk" and type: $PVM_ROOT/lib/pvmd -S -d0 -nhonk 1 80a9ca95:0cb6 4096 2 80a95c43:0000 Type response:after typing the given command on host honk, you should see a line like: ddpro<2312> arch ip<80a95c43:0a8e> mtu<4096>type this line on the tty of the master pvmd. You should then see:ï;@nD0 .€ß€€‚‚‚‚€‚€‚‚ÿ Thanksand the two pvmds should be able to communicate. Note you can't start the master using the console or background it when using this option.OVERLOADING HOSTSYou can force PVM to overload a host (start more than one pvmd on it) by putting a '$' before the host name in the host file. This is not recommended unless you know what you're doing and have a good reason for it. You must build the PVM source with option OVERLOADHOST defined for it to work.i;OB×G. *€w€€‚‚€‚€‚‚ÿYou may also need to use the ip= hostfile option to define several names with the same IP address. If two or more hosts in a PVM have the same name, they cannot be identified uniquely.STOPPING PVMD3The preferred method of stopping all the pvmds is to give halt command in the PVM console. This kills all PVM tasks, all the remote daemons, the local daemon, and finally the console itself. If the master pvmd is killed manually it should be sent a SIGTERM signal to allow it to kill the remote pvmds and clean up various files. The pvmd can be killed in a manner that leaves the file /tmp/pvmd.uid behind on one or more hosts. Uid is the numeric user ID (from /etc/passwd) of the user. This will prevent PVM from restarting on that host. Deletion of this file will fix this problem: 4ónD JA P€ç€€‚‚‚€€‚ƒƒƒ‚ƒ‚ƒƒƒ‚ƒƒ‚ƒ‚ƒƒƒƒ‚ÿ rm `( grep $user /etc/passwd || ypmatch $user passwd ) | awk -F: '{print "/tmp/pvmd."$3; exit}'`FILES $PVM_ROOT/lib/pvmd PVM daemon startup script $PVM_ROOT/lib/$PVM_ARCH/pvmd3PVM daemon executable $HOME/.pvmprofile Shell commands read by pvmd before running pvmd3 $HOME/pvm3/bin/$PVM_ARCH Private PVM executable directory $PVM_ROOT/pvm3/bin/$PVM_ARCH System PVM executable directory /tmp/pvmd.uid Pvmd local socket address©|×G´J- *€ø€€ƒƒƒƒ‚ƒƒƒ‚‚‚ÿ /tmp/pvml.uid Pvmd runtime error log $HOME/.rhosts File allowing access to a host from other hostsJ JþJ1±€ÿÿÿÿþJ=KTÁlibpvm3, libfpvm3 library?´J=K# €8€€‚ÿlibpvm3, libfpvm3 library> þJ{N1 0€€€€‚‚€€‚‚‚ÿlibpvm3.a, libfpvm3.a PVM C and Fortran programming librariesDESCRIPTIONAll PVM applications must be linked with the libpvm library to allow them to communicate with other entities in the PVM system. The base library (libpvm3.a) is written in C and directly supports C and C++ applications. The Fortran library (libfpvm3.a) consists of wrapper functions to convert Fortran calling sequences to C. Applications written in C must be linked with at least the base PVM library, libpvm3.a. Fortran applications must be linked with both libfpvm3.a and libpvm3.a. On some operating systems, PVM programs must be linked with other vendor-provided libraries (containing for example, socket or XDR functions). Programs that use group functions must also be linked with libgpvm3.a.Ö=K¥€H ^€­€€‚€€‚‚‚€€‚‚‚‚€€‚‚‚‚€€‚ÿSUBROUTINESThe libpvm subroutines can be divided into roughly five classes:Message Passingpvm_bufinfo, pvm_freebuf, pvm_getrbuf, pvm_getsbuf, pvm_initsend, pvm_mcast, pvm_mkbuf, pvm_nrecv, pvm_pack, pvm_precv, pvm_probe, pvm_psend, pvm_recv, pvm_recvf, pvm_send, pvm_sendsig, pvm_setmwid, pvm_setrbuf, pvm_{N¥€´Jsetsbuf, pvm_trecv, pvm_unpackTask Controlpvm_exit, pvm_kill, pvm_mytid, pvm_parent, pvm_pstat, pvm_spawn, pvm_tasks Group Library Functionsi'{NƒB R€O€€‚‚‚€€‚‚‚‚€€‚‚‚‚€€‚‚ÿpvm_barrier, pvm_bcast, pvm_gather, pvm_getinst, pvm_gettid, pvm_gsize, pvm_joingroup, pvm_lvgroup, pvm_reduce, pvm_scatterVirtual Machine Controlpvm_addhosts, pvm_config, pvm_delhosts, pvm_halt, pvm_mstat, pvm_reg_hoster, pvm_reg_rm, pvm_reg_tasker, pvm_start_pvmd Miscellaneouspvm_archcode, pvm_catchout, pvm_getopt, pvm_hostsync, pvm_notify, pvm_perror, pvm_setopt, pvm_settmask, pvm_tidtohostERRORSOn success, most libpvm functions return the constant PvmOk. The following error conditions can be returned by libpvm functions:À¥€…O l€€€‚€€‚‚‚€€‚‚‚€€‚‚‚€€‚‚‚€€‚ÿPvmAlreadyThe requested operation requires exclusive access, and another was already in progress.PvmBadMsgThe received messages has a data format native to another machine, which cannot be decoded by libpvm.PvmBadParamA bad parameter was passed to the function.PvmBadVersionTwo PVM components (pvmd and task, two pvmds or two tasks) have incompatible protocol versions and cannot interoperate. Version mismatchPvmCantStart„<ƒ¡‡H ^€y€€‚‚€€‚‚‚€€‚‚‚€€‚‚‚€€‚‚ÿA pvmd could not be started on the local host, or a slave pvmd could not be started on a remote host.PvmDSysErrSome internal mechanism in the pvmd failed during the requested operation. PvmDupEntryThe class server already has an entry matching the insert request. [In Version 3.4: Relaced by PvmExists]PvmDupGroupThe task has already a member of the group it attempted to join.PvmDupHostAn attempt was made to add the same host to a virtual machine more than once, or to add a host already a member of another virtual machine owned by the same user.º…´‰Y €€u€€‚€€‚‚‚€€‚‚‚€€‚‚‚€€‚‚‚€€‚‚‚€€‚‚ÿPvmDeniedOperation is refused due to locking, permissions, etc.PvmExistsThere is already an entry matching the insert request.PvmHostFailA foreign host in the virtual machine failed during the requested operation. PvmMismatchA parameter does not match a corresponding one.PvmNoBufThere is no current message buffer to pack or unpack.PvmNoDataThe end of a message buffer was reached while trying to unpack data.¡‡Ï‹Y €€…€€‚€€‚‚‚€€‚‚‚€€‚‚‚€€‚‚‚€€‚‚‚€€‚‚ÿPvmNoEntryThe class server has no entry matching the lookup request. [In Version 3.4: Relaced by PvmNotFound]PvmNoFileThe named executable does not exist.PvmNoGroupThe named group does not exist.PvmNoHostThere is no host in the virtual machine with the given name, or the name could not be resolved to an address.PvmNoInstThe named group has no member with this instance.PvmNoMemMalloc failed to get memory for libpvm.Ÿ´‰Ñc ”€?€€‚€€‚‚‚€€‚‚‚€€‚‚‚€€‚‚‚€€‚‚‚€€‚‚‚€€‚‚‚ÿPvmNoParentThis task has no parent task.PvmNoSuchBufThere is no message buffer with the given buffer handle.PvmNoTaskNo task exists with the given tid.PvmNotFoundNo entry matching the lookup request was found.PvmNotImplThis libpvm function or option is not implemented.PvmNotInGroupThe named group has no such member task.PvmNullGroupA null group name was passed to a function.»Ï‹ØL f€w€€€‚‚‚€€‚‚‚€€‚‚‚€€‚‚ƒƒ‚ƒƒ‚ƒƒ‚ÿPvmOutOfResThe requested operation could not be completed due to lack of resources.PvmOverflowA value is too large to be packed or unpacked.PvmSysErrLibpvm could not contact a pvmd on the local host, or the pvmd failed during an operation.FILES$PVM_ROOT/include/fpvm3.h Fortran header file$PVM_ROOT/include/pvm3.h C header file$PVM_ROOT/include/pvmsdpro.h Header file for tasker, hoster and resource manager tasksp-ÑTÁC T€[€€ƒƒ‚ƒ‚ƒØTÁ´J‚ƒ‚‚‚ãñnõ‰‚ã}$ቂ㛮tö‰‚ÿ$PVM_ROOT/include/pvmtev.h Header file for tasks manipulating trace events$PVM_ROOT/lib/$PVM_ARCH/libpvm3.a C (base) library$PVM_ROOT/lib/$PVM_ARCH/libfpvm3.a Fortran wrapper library$PVM_ROOT/lib/$PVM_ARCH/libgpvm3.a Group function librarysee alsoPVM Intropvm consolepvmd3 daemonNØ¢Á1 €€¢ÁåÁÀÅPVM Message Passing FunctionsC TÁåÁ# €@€€‚ÿPVM Message Passing FunctionsâÁéÃA P€‡€€‚‚‚€€‚‚‚‚€€‚‚‚‚€€‚ÿIn the following pages you will retrieve information about:Message Passingpvm_bufinfo, pvm_freebuf, pvm_getrbuf, pvm_getsbuf, pvm_initsend, pvm_mcast, pvm_mkbuf, pvm_nrecv, pvm_pack, pvm_precv, pvm_probe, pvm_psend, pvm_recv, pvm_recvf, pvm_send, pvm_sendsig, pvm_setmwid, pvm_setrbuf, pvm_setsbuf, pvm_trecv, pvm_unpackTask Controlpvm_exit, pvm_kill, pvm_mytid, pvm_parent, pvm_pstat, pvm_spawn, pvm_tasks Group Library Functions×åÁÀÅ: B€;€€‚‚‚€€‚‚‚‚€€‚‚‚‚ÿpvm_barrier, pvm_bcast, pvm_gather, pvm_getinst, pvm_gettid, pvm_gsize, pvm_joingroup, pvm_lvgroup, pvm_reduce, pvm_scatterVirtual Machine Controlpvm_addhosts, pvm_config, pvm_delhosts, pvm_halt, pvm_mstat, pvm_reg_hoster, pvm_reg_rm, pvm_reg_tasker, pvm_start_pvmd Miscellaneouspvm_archcode, pvm_catchout, pvm_getopt, pvm_hostsync, pvm_notify, pvm_perror, pvm_setopt, pvm_settmask, pvm_tidtohost= éÃýÅ1ó ÿÿÿÿhýÅ/Æ pvm_addhosts2ÀÅ/Æ# €€€‚ÿpvm_addhostsQýÅ€È8 >€3€€€‚‚ƒ‚‚ƒ‚‚€€‚‚‚‚ÿpvm_addhosts - Add hosts to the virtual machine.Cint info = pvm_addhosts( char **hosts, int nhost, int *infos )Fortrancall pvmfaddhost( host, info )PARAMETERShostsAn array of strings naming the hosts to be added. Pvmd must already be installed and the user must have an account on the specified hosts. nhost Integer specifying the length of array hosts. infos Integer array of length nhost which returns the status for each host. Values less than zero indicate an error, while positive values are TIDs of the new hosts.æ/Æ™Ê3 4€Í€€‚‚‚‚‚‚‚€€‚‚‚ÿhostCharacter string naming the host to be added.infoInteger status code returned by the routine. Values less than \fInhost\fR indicate partial failure, and values less than 1 indicate total failure.DESCRIPTIONThe routine pvm_addhosts adds the computers named in hosts to the configuration of computers making up the virtual machine.The names should have the same syntax as lines of a pvmd hostfile (see man page for pvmd3):A hostname followed by options of the form xx=y.ò€ÈµÌ* "€å€€‚‚‚‚‚‚‚ÿIf pvm_addhosts is successful, info will be equal to nhost. Partial success is indicated by 0 < info < nhost,and total failure by info < 1.The array infos can be checked to determine which host caused the error.The Fortran routine pvmfaddhost adds a single host to the configuration with each call. info will be 1 if successful or < 0 if error.If a host fails, the PVM system will continue to function. The user can use this routine to increase the fault tolerance of his PVM application.?™ÊôÎ% €5€€‚‚ÿThe status of hosts can be requested by the application using pvm_mstat and pvm_config. If a host fails it will be automatically deleted from the configuration. Using pvm_addhosts a replacement host can be added by the application, however it is the responsibility of the application developer to make his application tolerant of host failure. Another use of this feature would be to add more hosts as they become available, for example on a weekend, or if the application dynamically determines it could use more computational power.,еÌ,\ †€¡€€‚‚‚€€‚‚‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚‚‚ƒ‚‚€€‚‚‚€€‚€€‚€€‚ÿpvm_addhosts requires the synchronization of the entire virtual machine.EXAMPLESC:static char *hosts[] = { "sparky", "thud.cs.utk.edu",};info = pvm_addhôÎ,ÀÅosts( hosts, 2, infos );Fortran:CALL PVMFADDHOST( 'azure', INFO )ERRORSThe following error conditions can be returned by pvm_addhostsPvmBadParam giving an invalid argument value.PvmAlready another task is currently adding hosts.PvmSysErr local pvmd is not responding.áhôÎ y À€Ñ€€‚‚€€‚€€‚€€‚€€‚€€‚€€‚‚‚ã›®tö‰‚ã®×0O‰‚ã®c¤©‰‚ãL<‰‚ãß©Eö‰‚‚€‚ÿand in the infos vector:PvmBadParam bad hostname syntax.PvmNoHost no such host.PvmCantStart failed to start pvmd on host.PvmDupHost host already configured.PvmBadVersion pvmd protocol versions don't match.PvmOutOfRes PVM has run out of system resources.see alsopvmd3 daemonpvm_delhostspvm_start_pvmdpvm_configpvm_mstat; ,H1‘ €ƒ€Hx @pvm_addmhf0 x# €€€‚ÿpvm_addmhf:øH²B R€ñ€€€‚‚‚‚‚ƒ‚ƒ‚‚‚ƒ‚‚€€‚‚‚‚‚‚‚‚ÿpvm_addmhf Install message-handler functions.pvm_delmhf Remove message-handler functions.SYNOPSISCint mhid = pvm_addmhf( int src, int tag, int ctx, int (*func)(int mid) )int info = pvm_delmhf( int mhid )FortranNot availablePARAMETERSsrc The tid of the sender.tag The tag sent with the message.ctx The context sent with the message.func Function to call when message received.mhid Message handler id.info Result code.mid Message buffer identifier for new active receive buffer.¼‡xn5 8€€€‚€€‚‚‚‚‚‚ƒ‚‚‚‚ÿDESCRIPTIONpvm_addmhf specifies a function that will be called whenever libpvm copies in a message whose header fields of src, tag, and ctx match those provided to pvm_addmhf().The src and tag fields may be left unspecified (wildcard) by setting to -1.The calling sequence of the message handler function is:int handler( int mid )Where mid is the bufid of the received message. The handler function is completely responsible for the receivedmessage buffer. It must use pvm_setrbuf to unpack the contents of the message (and to restore the current buffer afterward), and it must call pvm_freebuf to deallocate the message when done.Í–²; 7 <€-€€‚‚‚‚‚ƒ‚‚ƒ‚ƒ‚ƒ‚ƒ‚‚‚‚‚ÿNote:Operation in the message handler context is somewhat restricted.The function may call some PVM functions, but not others.For example, it may compose and send a reply message as shown:int sbf;sbf = pvm_setsbuf(0);pvm_packf("%+ %s", PvmDataDefault, "got your message");pvm_send(tid, tag);pvm_freebuf(pvm_setsbuf(sbf));but is not allowed to call certain other PVM communication functions, such as multicast or receive.pvm_addmhf returns the id number of the newly created message handler if successful; this number may be passed to pvm_delmhf to remove the entry. There is no guarantee to the ordering of id values returned by pvm_addmhf. Én[ W |€“€€‚‚‚‚€€‚€€‚€€‚‚‚ƒ‚‚ƒ‚ƒ‚ƒ‚ƒƒ‚‚ƒƒ‚ƒƒ‚ƒƒ‚ƒƒ‚ÿPvmExists is returned if the handler already exists.pvm_delmhf returns PvmOk if successful.PvmBadParam if pvm_delmhf is passed a negative id value.PvmNotFound if the id value is not found.EXAMPLES/* Print a message when hosts are added to virtual machine */inthostAdded( int mid ){int rbf, n;rbf = pvm_setrbuf(mid);pvm_unpackf("%d", &n);printf("*** %d new hosts just added ***\\n", n);pvm_freebuf(pvm_setrbuf(rbf));!Ø; |I `€±€€ƒ‚‚ƒ‚‚ƒ‚‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚‚€€‚‚‚‚‚€€‚ÿ}/* ... later ... */int src, tag, ctx;src = -1;tag = 99;ctx = -1;pvm_addmhf(src, tag, ctx, hostAdded);pvm_notify(PvmHostAdd, 99, -1, (int *)0);ERRORSThe following error conditions can be returned by pvm_addmhf():PvmExists: Can't insert as handler already exists with same (tag, ctx, src) including "wild-cards" (those set to -1)The following error conditions can be returned by pvm_delmhf():PvmBadParam: Invalid (negative) mhid passed in.\5[  @' €j€€€‚‚ÿPvmNotFound: Message handler mhiddoes not exist.| @ ; |G@1õhë†G@w@;Hpvm_advise0 @w@# €€€‚ÿpvm_advise»G@}BK d€w€€€‚‚‚‚‚‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚ƒƒƒ‚ƒƒƒ‚ƒƒƒ‚‚‚ÿpvm_advise() Controls use of direct task-to-task routing.[In Version 3.2: Replaced by pvm_setopt]SYNOPSISCint info = pvm_advise( int route )Fortrancall pvmfadvise( route, info )PARAMETERSroute Integer advising PVM to set up direct task-to-task links.route optionsPvmDontRoute1Don't allow direct links to this task PvmAllowDirect2Allow but don't request direct links PvmRouteDirect3Request direct linksinfoyKw@öE. *€—€€‚‚€€‚‚‚ÿInteger returning error status.DESCRIPTIONThe routine pvm_advise advises PVM on whether or not to set up direct task-to-task links (using TCP) forall subsequent communication. Once a link is established it remains until the application finishes. If a direct link can not be established because one of the two tasks has requested PvmDontRoute or because no resources are available, then the default route through the PVM daemons is used. pvm_advise can be called multiple times to selectively establish direct links, but is typically set only once near the beginning of each task. PvmAllowDirect is the default advise setting. This setting on task A allows other tasks to set up direct links to A. Once a direct link is established between tasks both tasks will use it for sending messages. pvm_advise returns the error status in info.¿}BùGD V€€€‚‚€€‚‚ƒ‚‚ƒ‚‚‚€€‚‚€€‚‚ÿThe performance of direct task-to-task links can be up to a factor of two better than the default route. The draw back is a lack of scalability of the direct links. Some versions of UNIX limit the number of links to no more than 30.EXAMPLESC:info = pvm_advise( PvmRouteDirect );Fortran:CALL PVMFADVISE( PVMROUTEDIRECT, INFO )ERRORSThis error condition can be returned by pvm_advisePvmBadParam: giving an invalid route value.BöE;H) "€2€€ã¿l‰‚ÿsee also pvm_setopt= ùGxH1å€Û‹ xHªH^Npvm_archcode2;HªH# €€€‚ÿpvm_archcodeÅxHoKF Z€ÿ€€€‚‚‚‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚‚‚‚€€‚‚ÿpvm_archcode Returns the data representation code for a PVM architecture name.SYNOPSISCint cod = pvm_archcode( char *arch )Fortrancall pvmfarchcode( arch, cod )PARAMETERSarch Character string containing the architecture name.cod Integer returning architecture code.DESCRIPTIONThe routine pvm_archcode returns an integer given an architecture name.The code returned identifies machines with compatible binary data formats. For example, SUN4 and RS6K have the same code, while ALPHA has a different one (because a few datatypes have different sizes). This lets you know when you can get away with using PvmDataRawÒªH~M= H€¥€€‚‚‚‚€€‚‚‚ƒ‚ƒ‚‚ƒ‚ƒ‚‚‚ƒ‚ÿinstead of PvmDataDefault encoding to pass messages between tasks on two machines.Naturally, you shouldn't assume the values returned by pvm_archcode are etched in stone; the numbers have no intrinsic meaning except thatif two different arch names map to the same value then they're compatible.EXAMPLESC:struct pvmhostinfo *hip;int i;pvm_config((int *)0, (int *)0, &hip);i = pvm_archcode(hip[0].hi_arch);Fortran:CALL PVMFARCHCODE( 'RS6K', k )àoK^NP n€!€€‚€€‚‚‚ãL<‰‚ãÆ$«æ‰‚ãA¦e‰‚ãÔøœ÷‰‚ãT‰‚ÿERRORSNo error conditions are be returned by pvm_archcodesee also pvm_config pvm_initsendpvm_notifypvm_taskspvm_tidtohost< ~MšN1¡ 놖 šNËN‚‡pvm_barrier1^NËN# €€€‚ÿpvm_barrierRšN)< F€-€€€‚‚‚‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚‚ÿpvm_barrier Blocks the calling process until all processes in a group have called it.SYNOPSISCint info = pvm_barrier( char *group, int count )Fortrancall pvmfbarrier( group, count, info )PARAMETERSgroup Character string group name. TËN)^Nhe group must exist and the calling process must be a member of the group.count Integer specifying the number of group members that must call pvm_barrier before they are all released. Though not required, count is expected to be the total number of members of the specified group.ÊšËNóƒ0 .€5€€‚‚‚‚€€‚‚‚ÿinfo Integer status code returned by the routine. Values less than zero indicate an error.DESCRIPTIONThe routine pvm_barrier blocks the calling process until count members of the group have called pvm_barrier.The count argument is required because processes could be joining the given group after other processes have called pvm_barrier. Thus PVM doesn't know how many group members to wait for at any given instant. Although count can be set less, it is typically the total number of members of the group. So the logical function of the pvm_barrier call is to provide a group synchronization. During any given barrier call all participating group members!à)†A P€Á€€‚‚‚‚‚€€‚‚‚ƒ‚ƒ‚ƒ‚ƒ‚‚‚ƒ‚ƒ‚ƒ‚ÿmust call barrier with the same count value. Once a given barrier has been successfully passed,pvm_barrier can be called again by the same group using the same group name.If pvm_barrier is successful, info will be 0. If some error occurs then info will be < 0.EXAMPLESC:inum = pvm_joingroup( "worker" ); . .info = pvm_barrier( "worker", 5 );Fortran:CALL PVMFJOINGROUP( "shakers", INUM )COUNT = 10CALL PVMFBARRIER( "shakers", COUNT, INFO )n󃂇R r€9€€‚‚€€‚‚€€‚€€‚€€‚€€‚‚ãC^w0‰‚‚ÿERRORSThese error conditions can be returned by pvm_barrierPvmSysErr: pvmd was not started or has crashed.PvmBadParam giving a count < 1.PvmNoGroup giving a non-existent group name.PvmNotInGroup calling process is not in specified group.see also pvm_joingroup: †¼‡1 Û‹€ ¼‡ë‡´Ápvm_bcast/ ‚‡ë‡# €€€‚ÿpvm_bcastD¼‡/Š@ N€ €€€‚‚‚‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚‚‚‚‚‚ÿpvm_bcast Broadcasts the data in the active message buffer to a group of processes.SYNOPSISCint info = pvm_bcast( char *group, int msgtag )Fortrancall pvmfbcast( group, msgtag, info )PARAMETERSgroup Character string group name of an existing group.msgtag Integer message tag supplied by the user.msgtag should be >= 0. It allows the user's program to distinguish between different kinds of messages .info integer status code returned by the routine. Values less than zero indicate an error.äë‡B/ ,€É€€‚€€‚‚‚‚‚ÿDESCRIPTIONThe routine pvm_bcast broadcasts a message stored in the active send buffer to all the members of group. In PVM 3.2 and later the broadcast message is not sent back to the sender. Any PVM task can call pvm_bcast(), it need not be a member of the group. The content of the message can be distinguished by msgtag.If pvm_bcast is successful, info will be 0. If some error occurs then info will be < 0.pvm_bcast is asynchronous. Computation on the sending processor resumes as soon as the message is safely on its way to the receiving processors. This is in contrast to synchronous communication, during which computation on the sending processor halts until a matching receive is executed by all the receiving processors.ð/ŠX& €á€€‚‚‚ÿpvm_bcast first determines the tids of the group members by checking a group data base. A multicast is performed to these tids. If the group is changed during a broadcast the change will not be reflected in the broadcast.Multicasting is not supported by most multiprocessor vendors.Typically their native calls only support broadcasting to all the user's processes on a multiprocessor. Because of this omission, pvm_bcast may not be an efficient communication method on some multiprocessors.*ÏBŽÁ[ „€Ÿ€€‚€€‚‚‚ƒ‚ƒ‚ƒ‚ƒ‚‚‚ƒ‚ƒ‚ƒ‚‚€€‚‚€€‚€€‚€€‚ÿEXAMPLESC:info = pvm_initsend( PvmDataRaw );info = pvm_pkint( arrayXŽÁ‚‡, 10, 1 );msgtag = 5 ;info = pvm_bcast( "worker", msgtag );Fortran:CALL PVMFINITSEND( PVMDEFAULT )CALL PVMFPKFLOAT( DATA, 100, 1, INFO )CALL PVMFBCAST( 'worker', 5, INFO )ERRORSThese error conditions can be returned by pvm_bcastPvmSysErr: pvmd was not started or has crashed.PvmBadParam: giving a negative msgtag.PvmNoGroup: giving a non-existent group name.&X´Á# €€€‚ÿ< ŽÁðÁ1‰–{† ðÁ!ÂyÉpvm_bufinfo1´Á!Â# €€€‚ÿpvm_bufinfoÜðÁ4Ä7 <€¹€€€‚‚‚‚ƒ‚‚ƒ‚‚‚‚‚‚‚‚‚ÿpvm_bufinfo() Returns information about a message buffer.SYNOPSISCint info = pvm_bufinfo( int bufid, int *bytes, int *msgtag, int *tid )Fortrancall pvmfbufinfo( bufid, bytes, msgtag, tid, info )PARAMETERSbufid Integer specifying a particular message buffer identifier.bytesInteger returning the length in bytes of the body of the message. This will be equal to the actual size of the data packed, if PvmDataRawis used, otherwise it may include pad bytes.Æ!Â6Ç< F€€€‚‚‚‚‚‚‚‚‚‚€€‚€€‚‚ÿmsgtagInteger returning the message label. Useful when the message was received with a wildcard msgtag.tidInteger returning the source of the message. Useful when the message was received with a wildcard tid.infoInteger status code returned by the routine. Values less than zero indicate an error.DESCRIPTIONThe routine pvm_bufinfo returns information about the requested message buffer. Typically it is used to determinefacts about the last received message such as its size or source. pvm_bufinfo is especially useful when an application is able to receive any incoming message, and the action taken depends on the source tid and the msgtag associated with the message that comes in first.Ä4ÄQÉW |€‰€€‚‚‚‚‚ƒ‚ƒ‚‚‚ƒ‚ƒ‚‚€€‚€€‚€€‚€€‚‚ã¬M„#‰‚ÿIf pvm_bufinfo is successful, info will be 0. If some error occurs then info will be < 0.EXAMPLESC:bufid = pvm_recv( -1, -1 );info = pvm_bufinfo( bufid, &bytes, &type, &source );Fortran:CALL PVMFRECV( -1, -1, BUFID )CALL PVMFBUFINFO( BUFID, BYTES, TYPE, SOURCE, INFO )ERRORSThis error condition can be returned by pvm_bufinfo.PvmNoSuchBuf: specified buffer does not exist.PvmBadParam: invalid argumentsee also pvm_recv(6ÇyÉ$ €€€‚‚ÿ= QɶÉ1ˆ €Ð ¶ÉèÉhpvm_catchout2yÉèÉ# €€€‚ÿpvm_catchoutÄr¶É¬ÌR r€å€€€‚‚‚‚ƒ‚‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚‚‚‚‚‚‚€€‚€€‚ÿpvm_catchout Catch output from child tasks.SYNOPSISC#include int info = pvm_catchout( FILE *ff )Fortrancall pvmfcatchout( onoff, info )PARAMETERSffFile descriptor on which to write collected output.onoffInteger parameter. Turns output collection on or off.infoInteger status code returned by the routine. Values less than zero indicate an error.DESCRIPTIONThe routine pvm_catchout causes the calling task (the parent) to catch output from tasks spawned after the call to pvm_catchout. Characters printed on \fIstdout\fR or \fIstderr\fR in children tasks are collected by the pvmdsY)èÉÏ0 .€S€€‚‚‚‚‚ƒ‚ƒ‚ƒ‚‚‚ÿand sent in control messages to the parent task, which tags each line and appends it to the specified file.Output from grandchildren (spawned by children) tasks is also collected, provided the children don't reset PvmOutputTid.If option PvmShowTids (see pvm_setopt) is true (nonzero), output is printed as shown below, tagged with the task id where the output originated: [txxxxx] BEGIN[txxxxx] (text from child task)[txxxxx] ENDThe output from each task includes one BEGIN line and one END line, with whatever the task prints in between.6 ¬ÌG* "€€€‚‚‚‚‚‚‚ÿIf PvmShowTids is false, raw output is printed with no additional information.In C, the output file descriptor may be specified. Giving a null pointer turns output collection off.In Fortran, output collectÏGyÉion can only be turned on or off, and is logged to stdout of the parent task.If pvm_exit is called while output collection is in effect, it will block until all tasks sending it output have exited,in order to print all their output. To avoid this, output collection can be turned off by calling pvm_catchout(0)!ÐÏhQ p€¡€€‚‚‚‚€€‚‚‚ƒ‚‚ƒ‚‚‚ƒ‚‚‚ãpu#‰‚ã¿l‰‚ã½€z÷‰‚‚ÿbefore calling pvm_exit.pvm_catchout() always returns 0.EXAMPLESC:#include pvm_catchout(stdout);Fortran:CALL PVMFCATCHOUT( 1, INFO )see alsopvm_exitpvm_setoptpvm_spawn; G£1^ {†× £Ó pvm_config0 hÓ# €€€‚ÿpvm_config¸£ØM h€q€€€‚‚‚‚ƒ‚ƒ‚ƒƒ‚ƒƒ‚ƒƒ‚ƒƒ‚ƒ‚‚ƒ‚‚‚€€‚‚‚‚‚‚ÿpvm_config Returns information about the present virtual machine configuration.SYNOPSISCint info = pvm_config( int *nhost, int *narch, struct pvmhostinfo **hostp ) .brstruct pvmhostinfo {int hi_tid;char *hi_name;char *hi_arch;int hi_speed;};Fortrancall pvmfconfig( nhost, narch, dtid, name, arch, speed, info )PARAMETERSnhostInteger returning the number of hosts (pvmds) in the virtual machine.narchUÓ-6 :€?€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ÿInteger returning the number of different data formats being used.hostpReturns pointer to an array of structures which contain information about each host including its pvmd task ID, name, architecture, and relative speed.dtidInteger returning pvmd task ID for hostnameCharacter string returning name of hostarchCharacter string returning architecture name of hostspeedInteger returning relative speed of host. Default value is 1000.infoInteger status code returned by the routine. Values less than zero indicate an error.LØ® 5 8€™€€‚€€‚€€‚‚‚‚ÿDESCRIPTIONThe routine pvm_config returns information about the present virtual machine. The information returned issimilar to that available from the console command conf.The C function returns information about the entire virtual machine in one call. The Fortran function returns information about one host per call and cycles through all the hosts. Thus, if pvmfconfig is called nhost times, the entire virtual machine will be represented. Note that in C the hostp array is allocated and owned by libpvm. It is automatically freed or reused on the next call to pvm_config.Ë-³ : B€—€€‚‚‚‚‚€€‚‚‚ƒ‚ƒ‚‚ƒ‚ƒ‚ÿNote that in Fortran the reported value of nhost and the host configuration do not change until the function resets at the end of a complete cycle. The user can reset pvmfconfig() at any time by calling it with nhost = -1.If pvm_config is successful, info will be 0. If some error occurs then info will be < 0.EXAMPLESC:struct pvmhostinfo *hostp;int i, nhost, narch;info = pvm_config( &nhost, &narch, &hostp );for (i = 0; i < nhost; i++)M ®  A P€€€ƒƒ‚‚‚ƒ‚ƒ‚ƒ‚‚€€‚‚‚‚‚ãÔøœ÷‰‚ÿprintf("%s\\n", hostp[i].hi_name);Fortran:Do i=1, NHOST CALL PVMFCONFIG( NHOST,NARCH,DTID(i),HOST(i),ARCH(i),SPEED(i),INFO )EnddoERRORSThe following error condition can be returned by pvm_configPvmSysErr: pvmd not responding.see also pvm_tasks; ³ ; 1|Ðð ; k ¶pvm_delete0 k # €€€‚ÿpvm_deleteK ; ¶? L€€€€‚‚‚‚‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚‚‚‚ÿpvm_delete delete data from pvmd database .br[In Version 3.4: Relaced by pvm_delinfo]SYNOPSISCint cc = pvm_delete( char *name, int index ) .brFortranNot availablePARAMETERSnameThe class name, a null-terminated string.indexThe class index, >= 0.= k ó1 × š…ó%ÌGpvm_delhosts2¶%# €€€‚ÿpvm_delhosts@üóqAD V€ù€€€‚‚‚‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚ÿpvm_delhosts Deletes hosts from the virtual machine.SYNOPSISCint info = pvm_delhosts( char **hosts, int nhost, int *infos )Fortrancall pvmfde%qA¶lhost( host, info )PARAMETERShostsAn array of pointers to character stringscontaining the names of the machines to be deleted.nhostInteger specifying the number of hosts to be deleted.infosInteger array of lengthnhostwhich contains the status code returned by the routine for the individual hosts. Values less than zero indicate an error.x@%éC8 >€€€‚‚‚‚‚‚‚€€‚€€‚ÿhostCharacter string containing the name of the machine to be deleted.infoInteger status code returned by the routine. Values less than nhost indicate partial failure, values less than 1 indicate total failure.DESCRIPTIONThe routine pvm_delhosts deletes the computers pointed to in hosts from the existing configuration of computers making up the virtual machine. All PVM processes and the pvmd running on these computers are killed as the computer is deleted. If pvm_delhosts is successful, info will be nhost. Partial success is indicated by 1<= info < nhost,$ûqA F) €÷€€‚‚‚‚‚‚ÿand total failure by info < 1.The array infos can be checked to determine which host caused the error.The Fortran routine pvmfdelhost deletes a single host from the configuration with each call.If a host fails, the PVM system will continue to function and will automatically delete this host from the virtual machine.An application can be notified of a host failure by calling pvm_notify. It is still the responsibility of the application developer to make his application tolerant of host failure. ¿_éCÌG` Ž€¿€€‚€€‚‚‚ƒ‚ƒƒ‚ƒƒ‚ƒ‚ƒ‚‚‚ƒ‚‚€€‚€€‚‚‚‚‚ã„”Z³‰‚ãA¦e‰‚‚‚ÿEXAMPLESC:static char *hosts[] = {"sparky","thud.cs.utk.edu",};info = pvm_delhosts( hosts, 2 );Fortran:CALL PVMFDELHOST( 'azure', INFO )ERRORSThese error conditions can be returned by pvm_delhostsPvmBadParam giving an invalid argument value.PvmSysErr local pvmd not responding.see also pvm_addhostspvm_notify< FH1¹ ð w„H9HËÅpvm_delinfo1ÌG9H# €€€‚ÿpvm_delinfoÆHJJK d€€€€‚€€‚€€‚€€‚‚‚‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚‚‚ÿpvm_putinfo,pvm_recvinfo,pvm_getmboxinfo,pvm_delinfo Store and retrieve messages in global mailbox.SYNOPSISCint index = pvm_putinfo( char *name, int bufid, int flags )int bufid = pvm_recvinfo( char *name, int index, int flags )int info = pvm_delinfo( char *name, int index, int flags )int info = pvm_getmboxinfo( char *pattern, int *nclasses, struct pvmmboxinfo **classes ) struct pvmmboxinfo {Ý9HXL1 0€»€€‚‚‚‚‚‚‚‚ƒ‚ƒ‚ƒ‚ÿ char *mi_name; /* class name */ int mi_nentries; /* # of entries for this class */ int *mi_indices; /* mbox entry indices */ int *mi_owners; /* mbox entry owner tids */ int *mi_flags; /* mbox entry flags */ };Fortrancall pvmfputinfo( name, bufid, flags, index )call pvmfrecvinfo( name, index, flags, bufid )call pvmfdelinfo( name, index, flags, info )t9JJÌN; D€s€€ƒ‚ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ÿcall pvmfgetmboxinfo( pattern, name, nclasses, nentries, index, owner, flags, info )PARAMETERSnameDatabase key (class name), any null-terminated string.indexDatabase key (class index), >= 0. Default index = 0.flagsUser specified options. (see below)bufidHandle of message buffer to put in database, or message returned. A returned bufid < 0 indicates an error.infoResulting status code.patternGNU regular expression (pattern) to match on names in mailbox database. Additionally, the singular "*" will match on all names.4ûXL ƒ9 @€÷€€‚‚‚‚‚‚‚‚‚‚‚‚‚€€‚‚‚ÿnclassesNumber of classes matching pattern.classesArray of pvmmboxinfo mailbox entries matching pattern.nentriesNumber of entries for a given class.ownerTask id that inserted entry into mailbox database.DESCRIPTIONThese functions impÌN ƒÌGlement a "message mailbox" database that can be used by PVM tasks to advertise information to other PVM tasks. An example would be to advertise names or locations of services. Another example would be to advertise a common "context" on which two tasks may communicate. The database entries are PVM messages keyed by a user specified name and an optional index value. The name may be any null-terminated string and the index a non-negative integer. The index value is assigned by PVM and is used to uniquely identify one of multiple named instances within the database. Entries are "owned" by the task that created them. An entry is automatically removed from the database when the owner task exits unless the database entry was created with flag PvmMboxPersistent..ÌN:…) € €€‚‚‚‚‚‚ÿWhen a task exits and leaves an entry in the mailbox, the owner tid of that entry is marked as zero (0) to indicate that there is no longer an active owner task.pvm_putinfoinserts a record in the database, given a key and data (message). It returns mailbox index number if the record is successfully stored, PvmExists if a record with the given key already exists, or PvmDenied if an attempt is made to overwrite a locked record. The following options are added together as the flags parameter to pvm_putinfo. Ý ƒC‡, &€»€€‚‚‚‚‚‚‚‚‚ÿPvmMboxDefaultInserts entry as the only named instance for a given name. This entry may only be modified and deleted by its owner. It is automatically deleted when its owner exits.PvmMboxPersistentEntry remains in the database when the owner task exits. Entries are removed from the database when PVM is halted or a reset is issued from the console.PvmMboxMultiInstancePermits multiple entry instances of the same name. PVM will assign an index key to each instance.î:…\‰+ $€Ý€€‚‚‚‚‚‚‚‚ÿPvmMboxOverWritablePermits other tasks to overwrite and delete this database entry.pvm_recvinfooperates just like a pvm_recv() except the message is coming from the database. The message should be unpacked after pvm_recvinfo(). Like pvm_recv, pvm_recvinfo returns a pointer to a message buffer containing the record matching the key from the database. Returned value < 0 indicates an error.The following options are added together as the flags parameter to pvm_recvinfo.vJC‡Ò‹, &€•€€‚‚‚‚‚‚‚‚‚ÿPvmMboxDefaultexact match on key is returned. Returns PvmNotFound if exact match not found.PvmMboxFirstAvailThe first entry in with index greater than or equal to the specified index parameter is retuned. PvmMboxFirstAvail with index = 0 will produce the same results as using PvmMboxDefault. PvmMboxReadAndDeleteReturn entry and delete from database. Task must be permitted to do both read and delete otherwise an error will occur. bufid returns PvmNotFound if entry does not exist and will return PvmDenied if the record exists but may not be deleted.tK\‰FŽ) €—€€‚‚‚‚‚‚ÿpvm_delinfodeletes database entry specified by the key . Returns PvmOK if the record was deleted, PvmNotFound if the record does not exist, or PvmDenied if an attempt is made to remove a "locked" record. There are no flags presently specified for pvm_delinfo.pvm_getmboxinforeturns an array of pvmmboxinfo for all class names in the database. This is used, for example, by programs that clean up the database or for applications to find out what is available. classes returns a pointer to the array allocated by libpvm and freed on the next call to pvm_getmboxinfo.(ïÒ‹zÀ9 @€ß€€‚‚‚€€‚‚‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ÿThe Fortran function returns information on one entry per call. Thus, if called repeatedly until an info value of PvmNotFound is returned, all entries matching the given pattern will have been returned. If a new pattern is desired, calling pvmfgetnames() with info = -1 will reset the entry name list and obtain a new list for the given pattern.EXAMPLESC:/** create and inFŽzÀÌGsert mailbox entry*/sprintf( service, "Task_A_service" );sprintf( message, "Greetings from task A." );ÍFŽ‹ÂD V€›€€ƒ‚ƒ‚ƒ‚ƒ‚ƒƒ‚ƒƒ‚ƒƒ‚ƒ‚‚‚ƒ‚ƒ‚ƒ‚ƒ‚ƒƒƒ‚ÿpvm_initsend( PvmDataDefault );pvm_pkint( &mytid, 1, 1 );pvm_pkint( &context, 1, 1 );pvm_pkstr( message );if (( pvm_putinfo( service, pvm_getsbuf(), PvmMboxDefault )) == PvmExists ){ printf( "can't register - service already running\n" );exit( -1 );}/** look for and retrieve specified mailbox*/sprintf( service, "Task_A_service" );if (( msg_buf = pvm_recvinfo(service, 0, PvmMboxFirstAvail )) >= 0 ){ pvm_setrbuf( msg_buf );9âzÀÄÄW |€Å€€ƒƒ‚ƒƒ‚ƒƒ‚ƒ‚‚‚ƒ‚‚€€‚‚€€‚€€‚€€‚€€‚ÿpvm_upkint( &their_tid, 1, 1 );pvm_upkint( &their_context, 1, 1 );pvm_upkstr( message );}Fortran:we need the fortran examples...ERRORSThe following error conditions can be returned by one or more of these functions: PPvmBadParam An invalid value was specified for bufid argument.PvmNoSuchBuf: Message buffer bufid doesn't exist.PvmNoMem: Libpvm is unable to allocate memory to pack data.PvmExists: The requested key is already in use (pvm_putinfo).È‹ÂËÅ? L€‘€€€‚€€‚‚‚ãÆ$«æ‰‚ã˜ÏÞm‰‚‚ÿPvmNotFound: The requested key does not exist (pvm_recvinfo, pvm_delinfo).PvmDenied: The key is locked by another task and cannot be replaced or deleted.see alsopvm_initsendpvm_getsbuf; ÄÄÆ1mš…—„Æ6ÆrÆpvm_delmhf0 ËÅ6Æ# €€€‚ÿpvm_delmhf<ÆrÆ) "€&€€ãàækñ‰‚ÿsee pvm_addmhf96Æ«Æ1¬w„‰‡«ÆÙÆTÊpvm_exit. rÆÙÆ# €€€‚ÿpvm_exit «ÆäÈI `€…€€€‚‚‚‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚€€‚€€‚ÿpvm_exit Tells the local pvmd that this process is leaving PVM.SYNOPSISCint info = pvm_exit( void )Fortrancall pvmfexit( info )PARAMETERSinfoInteger status code returned by the routine. Values less than zero indicate an error.DESCRIPTIONThe routine pvm_exit tells the local pvmd that this process is leaving PVM. This routine does not kill the process, which can continue to perform tasks just like any other serial process.p%ÙÆTÊK d€K€€‚‚‚€€‚‚‚ƒ‚ƒ‚ƒ‚‚‚ƒ‚ƒ‚‚€€‚€€‚‚ÿpvm_exit should be called by all PVM processes before they stop or exit for good. It must be called by processes that were not started with pvm_spawn.EXAMPLESC:/* Program done */pvm_exit();exit();Fortran:CALL PVMFEXIT(INFO)STOPERRORSPvmSysErr: pvmd not responding; äÈÊ1 —„ċʿʮÏpvm_export0 TÊ¿Ê# €€€‚ÿpvm_export€5Ê?ÍK d€k€€€‚‚‚‚ƒ‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚€€‚€€‚ÿpvm_export, pvm_unexport Mark environment variables to export through spawnSYNOPSISCint cc = pvm_export( char *name )int cc = pvm_unexport( char *name )FortranNot availablePARAMETERSnameName of an environment variable to add to or delete from export list.DESCRIPTIONThe routines pvm_export and pvm_unexport are provided for convenience in editing environment variable PVM_EXPORT, while maintaining the colon-separated list syntax it requires. The variable can be modified by other means, and at the same time by the pvm_export functions.Ñ¿ÊRÏB R€£€€‚‚‚€€‚‚‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚‚€€‚‚ÿpvm_export checks to see if a name is already in PVM_EXPORT before including it, and exporting a name more than once is not considered an error. Likewise, pvm_unexport will not complain if you specify a name not in PVM_EXPORT.EXAMPLESC:/* PVM_EXPORT=SHELL:HOME */pvm_export("DISPLAY");pvm_export("TERM");pvm_unexport("HOME");/* PVM_EXPORT=SHELL:DISPLAY:TERM */ERRORSNo error conditions are currently returned by pvm_export and pvm_unexport.\(?Í®Ï4 8€P€€‚‚ã}$ቂ㽀z÷‰‚‚‚ÿsee alsopvm consolepvm_spawn< RÏ 1ä‰‡Ä =ìpvm_freebuf®Ï ®Ï1®Ï=# €€€‚ÿpvm_freebuf{/ ¸L f€_€€€‚‚‚‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚‚‚‚€€‚€€‚ÿpvm_freebuf Disposes of a message buffer.SYNOPSISCint info = pvm_freebuf( int bufid )Fortrancall pvmffreebuf( bufid, info )PARAMETERSbufidInteger message buffer identifier.infoInteger status code returned by the routine. Values less than zero indicate an error.DESCRIPTIONThe routine pvm_freebuf frees the memory associated with the message buffer identified by bufid. Message buffers are created by pvm_mkbuf, pvm_initsend, and pvm_recv. If pvm_freebuf is successful, info will be 0. If some error occurs then info will be < 0.S.= % €]€€‚‚ÿpvm_freebuf can be called for a send buffer created by pvm_mkbuf after the message has been sent and is no longer needed. Receive buffers typically do not have to be freed unless they have been saved in the course of using multiple buffers. But pvm_freebuf can be used to destroy receive buffers as well. So messages that arrive but are no longer needed can be destroyed so they will not consume buffer space. Typically multiple send and receive buffers are not needed and the user can simply use the pvm_initsend routine toreset the default send buffer. ã¸' €Ç€€‚‚‚‚ÿThere are several cases where multiple buffers are useful. One example where multiple message buffers are needed involves libraries or graphical interfaces that use PVM and interact with a running PVM application but do not want to interfere with the application's own communication.When multiple buffers are used they generally are made and freed for each message that is packed. In fact, pvm_initsend simply does a pvm_freebuf followed by a pvm_mkbuf for the default buffer. ×v ìa €í€€‚€€‚‚‚ƒ‚ƒ‚‚‚ƒ‚ƒ‚‚‚‚‚€€‚€€‚‚‚ã“v;ö‰‚ãÆ$«æ‰‚ã¬M„#‰‚‚ÿEXAMPLESC:bufid = pvm_mkbuf( PvmDataDefault );info = pvm_freebuf( bufid );Fortran:CALL PVMFMKBUF( PVMDEFAULT, BUFID )CALL PVMFFREEBUF( BUFID, INFO )ERRORSThese error conditions can be returned by pvm_freebufPvmBadParam: giving an invalid argument value.PvmNoSuchBuf: giving an invalid bufid value.see alsopvm_mkbufpvm_initsendpvm_recv@, 1qÄ‹í, a ¡ pvm_freecontext5ìa # €$€€‚ÿpvm_freecontext@, ¡ ) "€.€€ãéZb‰‚ÿsee pvm_newcontext@a á 1Ö Ä‚á  3Epvm_freezegroup5¡  # €$€€‚ÿpvm_freezegroupJá ` I `€€€€‚‚‚‚ƒ‚‚ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚€€‚€€‚ÿpvm_freezegroup Freezes dynamic group membership and caches info locally SYNOPSISCint info = pvm_freezegroup( char *group , int size)Fortrancall pvmffreezegroup( group, size, info )PARAMETERSgroupCharacter string group name of an existing group.sizeSize of the group when it is frozen infosize of group on success. Values less than 0 indicate and error. DESCRIPTIONThe routine pvm_freezegroup makes a dynamic group named group static. The group information is then "cached" by all group members. pvm_freezegroup is a synchronizing routine and must be called by all group members to complete. size indicates the size the dynamic group should be when made static. A value of -1 indicates that the current size of the group should be used.zP æA* "€¡€€‚‚‚‚‚‚‚ÿinforeturns error information.Once a dynamic group has been frozen with pvm_freezegroup, all subsequent operations that can be satisfied with local data use the locally held information. For processes that are outside of the group, the first group call, e.g., pvm_bcast(), will cause the static group information to be copied to the calling process. Subsequent operations then use the local information. Barriers are still arbitrated by the group server.Group members should call pvm_lvgroup to leave the group and free any allocated structures that hold the group information. Processes not in the group may call pvm_lvgro` æA¡ up to free any locally allocated structures. In this case, an error code of PvmNotInGroup or PvmNoGroup will be returned to the caller. Barrier are always arbitrated by the group server, even if the group has been made static with pvm_freezegroup. If a process leaves a static group while other process are waiting at a barrier, then PvmNoGroup is returned to all processes waiting at the barrier. Future barrier calls with the defunct static group, return the same error.&Û`  DK d€·€€‚€€‚‚‚ƒ‚ƒ‚‚‚ƒ‚ƒ‚‚‚€€‚€€‚‚‚‚‚ÿEXAMPLESC: inum = pvm_joingroup("worker");info = pvm_freezegroup( "worker", size );Fortran: CALL PVMFJOINGROUP('group2', inum)CALL PVMFFREEZEGROUP( 'group2', size, info )ERRORSThese error conditions can be returned by pvm_freezegroupPvmSysErr: pvmd was not started or has crashed.PvmBadParam: giving a NULL group name.PvmDupGroup: trying to freeze a group that is already frozen.PvmNotInGroup: trying to freeze a group that you are not in.'çæA3E@ N€Ï€€‚€€‚‚‚‚‚‚‚‚ã• ãom\‰‚ÿBUGSThere is no way to unfreeze a group.Processes are not notified if a frozen group becomes invalid.Having a non-member process call pvm_lvgroup to free structures is a bit strange.see alsopvm_barrierpvm_lvgroup; DnE1ríæ nEžEÛ„pvm_gather0 3EžE# €€€‚ÿpvm_gather2÷nEÐH; D€ï€€€‚‚‚‚‚‚‚‚‚‚‚€€‚‚‚‚ÿpvm_gather A specified member of the group receives messages from each member of the group and gathers these messages into a single array.SYNOPSISC int info = pvm_gather( void *result, void *data, int count, int datatype, int msgtag, char *group, int rootginst)Fortran call pvmfgather(result, data, count, datatype, msgtag, group, rootginst, info)PARAMETERSresultOn the root this is a pointer to the starting address of an array datatype of local values which are to be accumulated from the members of the group. If n is the number of members in the group, then this array of datatype should be of length at least n* count. This argument is meaningful only on the root.b3žE2K/ ,€g€€‚‚‚‚‚‚‚‚‚‚‚‚ÿdata For each group member this is a pointer to the starting address of an array of length count of datatype which will be sent to the specified root member of the group.countInteger specifying the number of elements of datatype to be sent by each member of the group to the root.datatype Integer specifying the type of the entries in the result and data arrays. (See below for defined types.)msgtag Integer message tag supplied by the user. msgtag should be >= 0. It allows the user's program to distinguish between different kinds of messages.}NÐH¯N/ ,€€€‚‚‚‚‚‚‚‚‚‚‚‚ÿgroup Character string group name of an existing group.rootginstInteger instance number of group member who performs the gather of the messages from the members of the group.info Integer status code returned by the routine. Values less than zero indicate an error.DESCRIPTIONpvm_gather() performs a send of messages from each member of the group to the specified root member of the group. All group members must call pvm_gather(), each sends its array data of length count of datatype to the root which accumulates these messages into its result array. It is as if the root receives count elements of datatype from the ith member of the group and places these values in its result array starting with offset i* count from the beginning of the result array. The root task is identified by its instance number in the group. §u2Kb2 2€ë€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ÿC and Fortran defined datatypes are: C datatypes FORTRAN datatypes ----------------------------------- PVM_BYTE BYTE1 PVM_SHORT INTEGER2 PVM_INT INTEGER4 PVM_FLOAT REAL4 PVM_CPLX ¯Nb3E COMPLEX8 PVM_DOUBLE REAL8 PVM_DCPLX COMPLEX16 PVM_LONGIn using the scatter and gather routines, keep in mind that C stores multidimensional arrays in row order, typically starting with an initial index of 0; whereas, Fortran stores arrays in column order, typically starting with an offset of 1.)õ¯N‹ƒ4 6€ë€€‚‚‚‚€€‚‚‚‚‚‚‚ÿNote: pvm_gather() does not block. If a task calls pvm_gather and then leaves the group before the root has called pvm_gather an error may occur.The current algorithm is very simple and robust. A future implementation may make more efficient use of the architecture to allow greater parallelism.EXAMPLESC: info = pvm_gather(&getmatrix, &myrow, 10, PVM_INT, msgtag, "workers", rootginst);Fortran: CALL PVMFGATHER(GETMATRIX, MYCOLUMN, COUNT, INTEGER4, MTAG, 'workers', ROOT, INFO)PñbÛ„_ Œ€ã€€‚€€‚€€‚€€‚€€‚€€‚‚ãßäóó‰‚ã• 㺿áö‰‚‚‚ÿERRORSThese error conditions can be returned by pvm_gatherPvmNoInst: Calling task is not in the groupPvmBadParam: The datatype specified is not appropriatePvmSysErr: Pvm system errorpvm_bcastpvm_barrierpvm_psend?‹ƒ…1q‚ …N…Ž…pvm_getcontext4Û„N…# €"€€‚ÿpvm_getcontext@…Ž…) "€.€€ãéZb‰‚ÿsee pvm_newcontext; N…É…1¹ æ – É…ù…pvm_getfds0 Ž…ù…# €€€‚ÿpvm_getfdsò¯É…ëˆC T€_€€€‚‚‚‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚€€‚‚ÿpvm_getfds Get file descriptors in use by PVM.SYNOPSISCint nfds = pvm_getfds( int **fds )FortranNot AvailablePARAMETERSfdsReturns integer array of file descriptors.DESCRIPTIONA PVM task uses sockets to communicate between libpvm and other tasks or the pvmd. It is sometimes useful to know the file descriptor numbers of the sockets in order to wait from input from either PVM messages or an external source. For example, the PVM console waits on both keyboard input and notify messages. Input can be multiplexed by polling all sources, but this wastes cpu cycles. Instead, the select() system call can be used to wait until one or more sources of input are ready. çù…ø‹& €Ï€€‚‚‚ÿIf it completes successfully, pvm_getfds returns the number of sockets in use, and the file descriptor numbers in an array (allocated and freed by libpvm). At least one socket always exists (from task to pvmd), and its descriptor is always fds[0]. The number of sockets varies as direct routes are established to other tasks. It can be difficult to track the set of file descriptors if direct routing is enabled, because routes are created as messages are either sent or received. The simplest approach is to disable direct routing. When select returns with a PVM file descriptor ready, a complete message may be ready to be received, or instead only a fragment may be waiting. pvm_nrecv or pvm_probe should be used test without blocking. ½ëˆŽO l€{€€‚€€‚‚‚€€‚‚‚‚ƒ‚ƒ‚‚ƒ‚ƒ‚‚ƒ‚ƒ‚ƒ‚ƒ‚ƒƒ‚ƒƒ‚ÿRESTRICTIONSpvm_getfds is only available when running PVM on a Unix or similar system.EXAMPLESThe following program fragment waits until either keyboard input is available, or a PVM message has arrived.int *d;fd_set r;pvm_setopt(PvmRoute, PvmDontRoute);pvm_getfds(&d);FD_ZERO(&r);FD_SET(0, &r);FD_SET(d[0], &r);while (1) {if (select(d[0] + 1, &r, (fd_set*)0, (fd_set*)0, (struct timeval*)0) > 0) {}(ø‹U x€Q€€ƒƒƒ‚ƒƒƒƒ‚ƒƒƒ‚ƒƒƒƒ‚ƒƒ‚ƒ‚‚€€‚‚‚‚‚ãA¦e‰‚ã$2±÷‰‚‚ÿif (FD_ISSET(0, &r))... /* read keyboard input */if (FD_ISSET(d[0], &r) && pvm_nrecv(-1, -1) > 0)... /* got a PVM message */}}ERRORSThe following error condition can be returned by pvm_getfds:PvmSysErr: pvmd not responding.see alsopvm_notifypvm_trecv< ޽1o É„ ½ À›Åpvm_getinst1 À# €€€‚ÿpvm_getinst½ ÀÀ½ÂG \€€€€‚‚‚‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚‚‚‚‚‚€€‚ÿpvm_getinst Returns the instance number in a group of a PVM process.SYNOPSISCint inum = pvm_getinst( char *group, int tid )Fortrancall pvmfgetinst( group, tid, inum )PARAMETERSgroupCharacter string group name of an existing group.tidInteger task identifier of a PVM process.inumInteger instance number returned by the routine. Instance numbers start at 0 and count up. Values less than zero indicate an error.DESCRIPTION Ò ÀÄ8 >€¥€€‚‚€€‚‚‚ƒ‚ƒ‚ƒ‚‚‚ƒ‚ÿThe routine pvm_getinst takes a group name group and a PVM task identifier tid and returns the unique instance number that corresponds to the input. It can be called by any task whether in the group or not. If pvm_getinst is successful, inum will be >= 0. If some error occurs then inum will be < 0.EXAMPLESC:inum = pvm_getinst( "worker", pvm_mytid() );--------inum = pvm_getinst( "worker", tid[i] );Fortran:CALL PVMFGETINST( 'GROUP3', TID, INUM )~7›ÅG \€o€€‚€€‚€€‚‚‚‚‚‚‚ãC^w0‰‚ãÛ³F&‰‚‚ÿERRORSThese error conditions can be returned by pvm_getinstPvmSysErr: pvmd was not started or has crashed.PvmBadParam: giving an invalid tid value.PvmNoGroup: giving a non-existent group name.PvmNotInGroup:specifying a group in which the tid is not a member.see alsopvm_joingrouppvm_gettid@ÄÛÅ1n– ï„ ÛÅÆMÆpvm_getmboxinfo5›ÅÆ# €$€€‚ÿpvm_getmboxinfo=ÛÅMÆ) "€(€€ãkÙ9‰‚ÿsee pvm_putinfo< ƉÆ1nÉ„ … ‰ÆºÆ÷Æpvm_getmwid1MƺÆ# €€€‚ÿpvm_getmwid=‰Æ÷Æ) "€(€€ã¹B<‰‚ÿsee pvm_setmwid; ºÆ2Ç1þï„ ìŠ 2ÇbÇ/Îpvm_getopt0 ÷ÆbÇ# €€€‚ÿpvm_getopt$×2džÉM h€¯€€€‚‚‚‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚‚ƒƒ‚ƒƒ‚ƒƒ‚ƒƒ‚ƒ‚ƒƒ‚ÿpvm_getopt Returns the value of libpvm options.SYNOPSISCint val = pvm_getopt( int what )Fortrancall pvmfgetopt( what, val )PARAMETERSwhatInteger defining option to get.One of:PvmRoute1 Message routing policyPvmDebugMask 2 Libpvm debug maskPvmAutoErr3 Auto error reportingPvmOutputTid 4 Stdout destination for children PvmOutputCode 5 Output message tagPvmTraceTid 6 Trace data destination for children ábÇ¡Ë: B€Ã€€ƒ‚ƒƒ‚ƒƒ‚ƒ‚ƒ‚ƒƒ‚ƒ‚ƒƒ‚ƒƒ‚ÿPvmTraceCode 7 Trace message tagPvmFragSize 8 Message fragment sizePvmResvTids 9 Allow messages to reserved tags and TIDs PvmSelfOutputTid 10 Stdout destinationPvmSelfOutputCode 11 Output message tagPvmSelfTraceTid 12 Trace data destinationPvmSelfTraceCode 13 Trace message tagPvmShowTids 14 pvm_catchout prints task ids with output PvmPollType 15 Message wait policy (shared memory) #׆ÉÄÍL f€¯€€ƒƒ‚‚‚‚‚€€‚‚‚‚‚€€‚‚‚ƒ‚‚ƒ‚‚€€‚‚ÿPvmPollTime 16 Message spinwait durationvalInteger returning the value of the option.DESCRIPTIONThe routine pvm_getopt returns the value of the specified option in PVM. For a discussion of options and values, see pvm_setopt.If an error occurs, the PVM error code is returned in place of the option value.EXAMPLESC:val = pvm_getopt( PvmFragSize );Fortran:CALL PVMFGETOPT( PVMAUTOERR, VAL )ERRORSThis error condition can be returnedk?¡Ë/Î, (€~€€‚‚‚ã¿l‰‚ÿPvmBadParam: giving an invalid value.see alsopvm_setopt< ÄÍkÎ1\… y kΜÎipvm_getrbuf1/ΜÎ# €€€‚ÿpvm_getrbufÁkθO l€ƒ€€€‚‚‚‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚€€‚‚‚€€‚‚‚ƒ‚ÿpvm_getrbuf Returns the message buffer identifier for the active receive buffer.SYNOPSISCint bufid = pvm_getrbuf( void )Fortrancall pvmfgetrbuf( bufid )PARAMETERSbufidInteger returning message buffer identifier for the active receive buffer.DESCRIPTIONTheœÎ¸/Î routine pvm_getrbuf returns the message buffer identifier bufid for the active receive buffer or 0 if there is no current buffer.EXAMPLESC:bufid = pvm_getrbuf();±yœÎi8 @€ò€€‚‚ƒ‚‚€€‚‚‚‚ã˜ÏÞm‰‚ÿFortran:CALL PVMFGETRBUF( BUFID )ERRORSNo error conditions are returned by pvm_getrbufsee alsopvm_getsbuf< ¸¥1êìŠ ¹ ¥Öpvm_getsbuf1iÖ# €€€‚ÿpvm_getsbuf¹¥ÞO l€s€€€‚‚‚‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚€€‚‚‚€€‚‚‚ƒ‚ÿpvm_getsbuf Returns the message buffer identifier for the active send buffer.SYNOPSISCint bufid = pvm_getsbuf( void )Fortrancall pvmfgetsbuf( bufid )PARAMETERSbufidInteger returning message buffer identifier for the active send buffer.DESCRIPTIONThe routine pvm_getsbuf returns the message buffer identifier bufid for the active send buffer or 0 if there is no current buffer.EXAMPLESC:bufid = pvm_getsbuf();±yÖ8 @€ò€€‚‚ƒ‚‚€€‚‚‚‚ã™Ým‰‚ÿFortran:CALL PVMFGETSBUF( BUFID )ERRORSNo error conditions are returned by pvm_getsbufsee alsopvm_getrbuf; ÞÊ1Èy É !Êú‘ pvm_gettid0 ú# €€€‚ÿpvm_gettid¦]Ê I `€»€€€‚‚‚‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚‚‚‚‚‚‚€€‚‚ÿpvm_gettid Returns the tid of the process identified by a group name and instance number.SYNOPSISCint tid = pvm_gettid( char *group, int inum )Fortrancall pvmfgettid( group, inum, tid )PARAMETERSgroupCharacter string that contains the name of an existing group.inumInteger instance number of the process in the group.tidInteger task identifier returned.DESCRIPTIONThe routine pvm_gettid returns the tid of the PVM process identified by the group name group and the instance number inum. If pvm_gettid is successful, tid will be > 0. If some error occurs then tid will be < 0.ñ¦ú‘ K d€M€€‚€€‚‚‚ƒ‚‚‚ƒ‚‚‚‚‚‚‚‚‚‚ãC^w0‰‚ã>Óm‰‚‚ÿEXAMPLESC: tid = pvm_gettid("worker",0);Fortran: CALL PVMFGETTID('worker',5,TID)ERRORSThese error conditions can be returned by pvm_gettid.PvmSysErr: Can not contact the local pvmd; most likely it is not running.PvmBadParam: Bad Parameter most likely a NULL character string.PvmNoGroup: No group exists by that name.PvmNoInst: No such instance in the group.see alsopvm_joingrouppvm_getinst=  Î 1o¹ í "Î  > pvm_gettmask2‘  # €€€‚ÿpvm_gettmask>Î > ) "€*€€ã€è‰‚ÿsee pvm_settmask: x 1¿É Ü #x § 5pvm_gsize/ > § # €€€‚ÿpvm_gsizeÓx À F Z€§€€€‚‚‚‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚‚‚‚€€‚‚ÿpvm_gsize Returns the number of members presently in the named group.SYNOPSISCint size = pvm_gsize( char *group )Fortrancall pvmfgsize( group, size )PARAMETERSgroupCharacter string group name of an existing group.sizeInteger returning the number of members presently in the group. Values less than zero indicate an error.DESCRIPTIONThe routine pvm_gsize returns the size of the group named group. If there is an error size will be negative.-ó§ í: B€ç€€‚‚‚€€‚‚‚ƒ‚‚‚ƒ‚‚‚‚‚‚ÿSince groups can change dynamically in PVM 3.0, this routine can only guarantee to return the instantaneous size of a given group. It is the user's responsibility to make sure the group members are not changing dynamically during the call to pvm_gsize. EXAMPLESC:size = pvm_gsize( "worker" );Fortran:CALL PVMFGSIZE( 'group2', SIZE )ERRORSThese error conditions can be returned by pvm_gsizePvmSysErr: pvmd was not started or has crashed.PvmBadParam: giving an invalid group name.HÀ 5+ &€:€€‚‚ãC^w0‰‚ÿsee also pvm_joingroup9ín1í ”€ $nœžBpvm_halt. 5œ# €€€‚ÿpvm_haltÑnÄAK d€£€€€‚‚‚‚ƒ‚‚ƒ‚‚€‚‚€‚‚‚€€‚€€‚‚‚ÿpvm_halt Shuts down theœÄA5 entire PVM system.SYNOPSISCint info = pvm_halt( void )Fortrancall pvmfhalt( info )PARAMETERSinfoInteger returns the error status.DESCRIPTIONThe routine pvm_halt shuts down the entire PVM system including remote tasks, remote pvmds, the local tasks (including the calling task) and the local pvmd.The task calling pvm_halt() must ignore or catch signal \fISIGTERM\fR or it will be killed along with all the others.Ú”œžBF Z€)€€‚€€‚‚‚‚‚ã®×0O‰‚ãî{#‰‚ãpu#‰‚‚‚ÿERRORSThe following error conditions can be returnedPvmSysErr: ocal pvmd is not responding.see alsopvm_delhostspvm_killpvm_exit= ÄAÛB1ìÜ q† %ÛB CÈIpvm_hostsync2žB C# €€€‚ÿpvm_hostsyncÅÛBEC T€‹€€€‚‚‚‚ƒ‚‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚‚‚‚‚‚ÿpvm_hostsync Get time-of-day clock from PVM host.SYNOPSISC#include int info = pvm_hostsync( int host, struct timeval *clk, struct timeval *delta )Fortrancall pvmfhostsync( host, clksec, clkusec, deltasec, deltausec, info ) PARAMETERShostTID of host.clk(or clksec and clkusec) Returns time-of-day clock sample from host.delta(or deltasec and deltausec) Returns difference between local clock and remote host clock.X# CmG5 8€G€€‚€€‚€€‚‚‚‚ÿDESCRIPTIONpvm_hostsync samples the time-of day clock of a host in the virtual machine and returns both the clock value and the difference between local and remote clocks. To reduce the delta error due to message transit time, local clock samples are taken before and after reading the remote clock. Delta is the difference between the mean local clocks and remote clock.Note that the delta time can be negative. The microseconds field is always normalized to 0..999999, while the sign of the seconds field gives the sign of the delta.ÊEIH ^€•€€‚‚ƒƒ‚ƒƒ‚ƒƒ‚ƒƒ‚ƒƒ‚‚‚‚‚‚€€‚€€‚‚ÿFor example:3.25 Sec = 3,2500000 = 0,0-1 uSec = -1,999999-1 Sec = -1,000000-1.1 Sec = -2,999000In C, if clk or delta is a null pointer, that parameter is not returned.ERRORSIf pvm_hostsync is successful, it returns PvmOk. These error conditions can be returned by pvm_hostsyncPvmSysErr: pvmd not responding.PvmNoHost: specified host not in virtual machine.PvmHostFail: host is unreachable (and thus possibly failed)ImGÈI- *€8€€‚‚ãL<‰‚‚‚ÿsee also pvm_config= IJ1? ”€ p &J7JB„pvm_initsend2ÈI7J# €€€‚ÿpvm_initsend ÁJDLL f€ƒ€€€‚‚ƒ‚‚ƒ‚‚‚‚‚‚ƒƒƒ‚ƒƒƒ‚ƒƒƒ‚ƒƒƒ‚‚‚ƒƒƒ‚ƒƒƒ‚ÿpvm_initsend Clear default send buffer and specify message encoding.Cint bufid = pvm_initsend( int encoding )Fortrancall pvmfinitsend( encoding, bufid )variables:encoding - Integer specifying the next message's encoding scheme.Options in C are:Encoding valueMEANINGPvmDataDefault0XDRPvmDataRaw1no encodingPvmDataInPlace2data left in placeOption names are in Fortran are:Encoding valueMEANINGPVMDEFAULT0XDRµw7JùN> J€ï€€ƒƒƒƒ‚ƒƒƒ‚‚‚‚‚€€‚€€‚ÿPVMRAW1no encodingPVMINPLACE2data left in placebufid:Integer returned containing the message buffer identifier.Values less than zero indicate an error.The routine pvm_initsend clears the send buffer and prepares it for packing a new message. The encoding scheme used for the packing is set by encoding. XDR encoding is used by default because PVM can not know if the user is going to add a heterogeneous machine before this message is sent.If the user knows that the next message will only be sent to a machine that understands the native format, then he can use PvmDataRaw encoding and save on encoding costs.X-DL]+ $€[€€‚€€‚ÿPvmDataInPlace encoding specifies that data be left in place during packing. The message buffer only contains the sizes and pointers to the items to be sent. When pvm_send is called the items are copied directly out of ùN]ÈIthe user's memory. This option decreases the number of times a message is copied at the expense of requiring the user to not modify the items between the time they are packed and the time they are sent.If pvm_initsend is successful, then bufid will contain the message buffer identifier. If some error occurs then bufid will be < 0.šUùN÷ƒE X€«€€‚‚‚‚ƒ‚ƒ‚ƒ‚ƒ‚‚‚ƒ‚ƒ‚ƒ‚‚€€€€‚ÿPvmDataInPlace allows only dense (stride = 1) data in version 3.3. It cannot be used on shared memory (*MP) architectures; a PvmNotImpl error will occur at send time.C:bufid = pvm_initsend( PvmDataDefault );info = pvm_pkint( array, 10, 1 );msgtag = 3 ;info = pvm_send( tid, msgtag );Fortran:CALL PVMFINITSEND(PVMRAW, BUFID)CALL PVMFPACK( REAL4, DATA, 100, 1, INFO )CALL PVMFSEND( TID, 3, INFO )These error conditions can be returned by pvm_initsend PvmBadParam giving an invalid encoding value PvmNoMem Malloc has failed. There is not enough memory to create the bufferK]B„0 0€6€€‚‚‚ã“v;ö‰‚€‚ÿsee alsopvm_mkbuf; ÷ƒ}„1öq† { '}„­„r‹pvm_insert0 B„­„# €€€‚ÿpvm_insertá–}„އK d€-€€€‚‚‚‚‚‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚‚‚‚‚‚‚€€‚‚ÿpvm_insert store data in pvmd database[In Version 3.4: Relaced by pvm_putinfo]SYNOPSISCint cc = pvm_insert( char *name, int index, int data )FortranNot availablePARAMETERSnameThe class name, a null-terminated string.indexThe class index, >= 0 or -1 for first available.dataData to store in the entry.DESCRIPTIONThe master pvmd maintains a simple database, which can be used to store values such as tids and make them accessible anywhere within a virtual machine. This is useful when building an application such as the group server, which must advertise its task id so clients can register send messages to register.J­„؉+ $€?€€‚€€‚ÿThe database stores integer data, indexed by pairs. The name may be any null-terminated string and the index any non-negative integer. Database entries are grouped by name into classes; index may be specified as -1 to store or retrieve the first available instance in a class. These functions are not part of the group library, but are the underlying mechanism used to implement it.pvm_insert stores data at the given index. If index is -1, the data is stored at the first available index in the named class, starting at 0.šIއr‹Q p€“€€‚€€‚€€‚€€‚€€‚‚‚ã•ó ‰‚ãœéT‰‚‚ÿERRORSIf successful, pvm_insert returns the index at which the data was stored, otherwise it returns a negative result. The following error conditions can be returned:PvmBadParam: giving an invalid argument value.PvmDupEntry: the requested pair is already in use.see alsopvm_deletepvm_lookup> ؉°‹1­p P (°‹ã‹ Âpvm_joingroup3r‹ã‹# € €€‚ÿpvm_joingroup…:°‹hŽK d€u€€€‚‚‚‚ƒ‚ƒ‚‚€€‚‚‚‚‚‚‚‚€€‚€€‚ÿpvm_joingroup Enrolls the calling process in a named group.SYNOPSISCint inum = pvm_joingroup( char *group )Fortrancall pvmfjoingroup( group, inum )PARAMETERSgroupCharacter string group name of an existing group.inumInteger instance number returned by the routine. Instance numbers start at 0 and count up. Values less than zero indicate an error.DESCRIPTIONThe routine pvm_joingroup enrolls the calling task in the group named group and returns the instance number, inum of this task in this group. If there is an error inum will be negative.î㋇À% €Ý€€‚‚ÿInstance numbers start at 0 and count up. When using groups a (group, inum) pair uniquely identifies a PVM process. This is consistent with the PVM 2.4 naming schemes. If a task leaves a group by calling pvm_lvgroup and later rejoins the same group, the task is not guaranteed to get the same instance number. PVM attempts to reuse old instance numbers, so when a task hއÀr‹joins a group it will get the lowest available instance number. A task can be a member of multiple groups simultaneously.™PhŽ ÂI `€¡€€‚€€‚‚‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚‚‚ãom\‰‚‚‚ÿEXAMPLESC:inum = pvm_joingroup( "worker" );Fortran:CALL PVMFJOINGROUP( 'group2', INUM )ERRORSThese error conditions can be returned by pvm_joingroupPvmSysErr: pvmd was not started or has crashed.PvmBadParam: giving a NULL group name.PvmDupGroup: trying to join a group you are already in.see also pvm_lvgroup9‡ÀYÂ1â{ q… )Y‡Â8Çpvm_kill. ‡Â# €€€‚ÿpvm_kill»pYÂBÅK d€á€€€‚‚‚‚ƒ‚ƒ‚‚€€‚‚‚‚‚‚‚‚€€‚€€‚ÿpvm_kill Terminates a specified PVM process.SYNOPSISCint info = pvm_kill( int tid )Fortrancall pvmfkill( tid, info )PARAMETERStidInteger task identifier of the PVM process to be killed (not yourself).infoInteger status code returned by the routine. Values less than zero indicate an error.DESCRIPTIONThe routine pvm_kill sends a terminate (SIGTERM) signal to the PVM process identified by tid. In the case of multiprocessors the terminate signal is replaced with a host dependent method for killing a process. If pvm_kill is successful, info will be 0. If some error occurs then info will be < 0.ö¦‡Â8ÇP n€M€€‚‚‚€€‚‚‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚‚ãpu#‰‚ã‹x#‰‚‚ÿpvm_kill is not designed to kill the calling process. To kill yourself in C call pvm_exit() followed by exit(). To kill yourself in Fortran call pvmfexit followed by stop.EXAMPLESC:info = pvm_kill( tid );Fortran:CALL PVMFKILL( TID, INFO )ERRORSThese error conditions can be returned by pvm_kill PvmBadParam: giving an invalid tid value.PvmSysErr: pvmd not responding.see alsopvm_exitpvm_halt; BÅsÇ1;P óˆ *sǣǭËpvm_lookup0 8Ç£Ç# €€€‚ÿpvm_lookup¢OsÇEÊS t€Ÿ€€€‚‚‚‚‚‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚‚‚‚‚‚‚€€‚ã3ê 9‰‚‚‚ÿpvm_lookup retrieve data from pvmd database[In Version 3.4: Relaced by pvm_getinfo]SYNOPSISCint cc = pvm_lookup( char *name, int index, int *data )FortranNot availablePARAMETERSnameThe class name, a null-terminated string.indexThe class index, >= 0 or -1 for first available.dataReturns the data stored in the entry.DESCRIPTIONSee pvm_insert for a description of this database.pvm_lookup retrieves data stored in the location given by . If index is -1, the data stored at the first existing index in the named class is returned.h&£Ç­ËB R€M€€‚€€‚‚‚‚‚‚‚‚ã•ó ‰‚ã3ê 9‰‚‚‚ÿEXAMPLESERRORSIf successful, pvm_lookup returns the index at which the data was stored (>= 0), otherwise it returns a negative error code:PvmBadParam: giving an invalid argument value.PvmNoEntry: the requested pair does not exist.see alsopvm_delete,pvm_insert< EÊéË1%q… ^ +éËÌñpvm_lvgroup1­ËÌ# €€€‚ÿpvm_lvgroupÌéË+ÎE X€™€€€‚‚‚‚ƒ‚ƒ‚‚€€‚‚‚‚‚‚‚‚€€‚‚ÿpvm_lvgroup Unenrolls the calling process from a named group.SYNOPSISCint info = pvm_lvgroup( char *group )Fortrancall pvmflvgroup( group, info )PARAMETERSgroupCharacter string group name of an existing group.infoInteger status code returned by the routine. Values less than zero indicate an error.DESCRIPTIONThe routine pvm_lvgroup unenrolls the calling process from the group named group. If there is an error info will be negative..ùÌe5 8€ó€€‚‚‚‚‚‚ƒ‚‚‚ƒ‚‚‚‚‚‚‚ÿIf a process leaves a group by calling either pvm_lvgroup or pvm_exit, and later rejoins the same group, the process may be assigned a new instance number. Old instance numbers are reassigned to processes calling pvm_joingroup. EXAMPLESC:info = pvm_lvgroup( "worker" );Fortran:CALL PVMFLVGROUP( 'group2', INFO )ERRORSThese error conditions can be returned by pvm_lvgroup PvmSysErr: pvmd not respondin+Îe­Ëg.PvmBadParam: giving a NULL group name.PvmNoGroup: giving a non-existent group name.Œ^+Îñ. ,€¼€€‚‚‚ãC^w0‰‚‚‚ÿPvmNotInGroup: asking to leave a group you are not a member of.see alsopvm_joingroup: e+1â óˆ  ,+Z pvm_mcast/ ñZ# €€€‚ÿpvm_mcastF + = H€€€€‚‚‚‚ƒ‚‚ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ÿpvm_mcast Multicasts the data in the active message buffer to a set of tasks.SYNOPSISCint info = pvm_mcast( int *tids, int ntask, int msgtag )Fortrancall pvmfmcast( ntask, tids, msgtag, info )PARAMETERSntaskInteger specifying the number of tasks to be sent to.tidsInteger array of lengthntaskcontaining the task IDs of the tasks to be sent to.msgtagInteger message tag supplied by the user. msgtag should be >= 0. It allows the user's program to distinguish between different kinds of messages .Ô©Zt+ $€S€€‚‚‚‚‚‚‚‚ÿinfoInteger status code returned by the routine. Values less than zero indicate an error.DESCRIPTIONThe routine pvm_mcast multicasts a message stored in the active send buffer to ntask tasks specified in the tids array. The message is not sent to the caller even if listed in the array of tids. The content of the message can be distinguished by msgtag. If pvm_mcast is successful, info will be 0. If some error occurs then info will be < 0.The receiving processes can call either pvm_recv or pvm_nrecv to receive their copy of the multicast. pvm_mcast is asynchronous and based on a minimum spanning tree algorithm between the pvmds. Computation on the sending processor resumes as soon as the message is safely on its way to the receiving processors. This is in contrast to synchronous communication, during which computation on the sending processor halts until the matching receive is executed by the receiving processor. E  ¹ % €A€€‚‚ÿpvm_mcast first determines which other pvmds contain the specified tasks. Then passes the message to these pvmds which in turn distribute the message to their local tasks without further network traffic. Multicasting is not supported by most multiprocessor vendors. Typically their native calls only support broadcasting to all the user's processes on a multiprocessor. Because of this omission, pvm_mcast may not be an efficient communication method on some multiprocessors except in the special case of broadcasting to all PVM processes. ¼tÁ L f€y€€‚€€‚‚‚ƒ‚ƒ‚ƒ‚ƒ‚‚‚ƒ‚ƒ‚ƒ‚‚‚‚‚‚‚‚‚㺿áö‰‚ÿEXAMPLESC:info = pvm_initsend( PvmDataRaw );info = pvm_pkint( array, 10, 1 );msgtag = 5 ;info = pvm_mcast( tids, ntask, msgtag );Fortran:CALL PVMFINITSEND(PVMDEFAULT)CALL PVMFPACK( REAL4, DATA, 100, 1, INFO )CALL PVMFMCAST( NPROC, TIDS, 5, INFO )ERRORSThese error conditions can be returned by pvm_mcastPvmBadParam: giving a msgtag < 0.PvmSysErr: pvmd not responding.PvmNoBuf: no send buffer.see alsopvm_psendJ¹  0 0€4€ã`‡àö€‰‚ㆅ#‰‚ÿpvm_precv,pvm_send: Á E 1}^ °‡ -E t ËJpvm_mkbuf/ t # €€€‚ÿpvm_mkbufªE z\ †€U€€€‚‚ƒ‚‚ƒ‚‚€€‚€€‚‚‚ƒƒƒ‚ƒƒƒ‚ƒƒƒ‚ƒƒƒ‚‚‚ƒƒƒ‚ƒƒƒ‚ƒƒƒ‚ÿpvm_mkbuf Creates a new message buffer.Cint bufid = pvm_mkbuf( int encoding )Fortrancall pvmfmkbuf( encoding, bufid )PARAMETERSencoding: Integer specifying the buffer's encoding scheme.Options in C are:Encoding valueMEANINGPvmDataDefault0XDRPvmDataRaw1no encodingPvmDataInPlace2data left in placeOption names in Fortran are:Encoding valueMEANINGPVMDEFAULT0XDRPVMRAW1no encoding·|t =B; D€ù€€ƒƒƒ‚‚€€‚‚‚€€‚‚‚‚ÿPVMINPLACE2data left in placebufid:Integer message buffer identifier returned. Values less than zero indicate an error.Description:The routine pvm_mkbuf creates a new message buffer and sets its encoding status to encoding. If pvm_mkbuf is successful, bufid will be the identifier for the new buffer, which can be usez=B d as a send buffer. If some error occurs then bufid will be < 0.With the default setting XDR encoding is used when packing the message because PVM can not know if the user is going to add a heterogeneous machine before this message is sent. The other options to encoding allow the user to take advantage of knowledge about his virtual machine even when it is heterogeneous. For example, if the user knows that the next message will only be sent to a machine that understands the native format, then he can use PvmDataRaw encoding and save on encoding costs.·zôD' €!€€‚‚‚‚ÿPvmDataInPlace encoding specifies that data be left in place during packing. The message buffer only contains the sizes and pointers to the items to be sent. When pvm_send is called the items are copied directly out of the user's memory. This option decreases the number of times a message is copied at the expense of requiring the user to not modify the items between the time they are packed and the time they are sent.pvm_mkbuf is required if the user wishes to manage multiple message buffers and should be used in conjunction with pvm_freebuf. pvm_freebuf should be called for a send buffer after a message has been sent and is no longer needed.‚Y=BvG) €³€€‚‚‚‚‚‚ÿReceive buffers are created automatically by the pvm_recv and pvm_nrecv routines and do not have to be freed unless they have been explicitly saved with pvm_setrbuf.Typically multiple send and receive buffers are not needed and the user can simply use the pvm_initsend routine to reset the default send buffer.There are several cases where multiple buffers are useful. One example where multiple message buffers are needed involves libraries or graphical interfaces that use PVM and interact with a running PVM application but do not want to interfere with the application's own communication.ÁôD|IE X€ƒ€€‚‚‚€€‚‚‚‚€€‚‚‚ƒ‚ƒ‚ƒ‚‚‚ƒ‚ƒ‚ÿWhen multiple buffers are used they generally are made and freed for each message that is packed.RESTRICTIONS:PvmDataInPlace allows only dense (stride = 1) data in version 3.3.It cannot be used on shared memory (*MP) architectures; a PvmNotImpl error will occur at send time.EXAMPLESC:bufid = pvm_mkbuf( PvmDataRaw );/* send message */info = pvm_freebuf( bufid );Fortran:CALL PVMFMKBUF(PVMDEFAULT, MBUF)*SEND MESSAGE HEREOvGËJI `€ €€ƒ‚‚€€‚‚‚ƒƒ‚ƒƒ‚‚‚ãÆ$«æ‰ƒ‚ãE3àc‰€‚ÿCALL PVMFFREEBUF( MBUF, INFO )ERRORSThese error conditions can be returned by pvm_mkbufPvmBadParamgiving an invalid encoding value.PvmNoMemMalloc has failed. There is not enough memory to create the buffersee alsopvm_initsendpvm_freebuf: |IK1 .K4K*€pvm_mstat/ ËJ4K# €€€‚ÿpvm_mstat5àKiNU x€Á€€€‚‚‚‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚‚‚‚ƒƒƒ‚ƒƒƒ‚ƒƒ‚ƒƒ‚‚€€‚‚ÿpvm_mstat Returns the status of a host in the virtual machine.SYNOPSISCint mstat = pvm_mstat( char *host )Fortrancall pvmfmstat( host, mstat )PARAMETERShostCharacter string containing the host name.mstatInteger returning machine status:valueMEANINGPvmOkhost is OKPvmNoHosthost is not in virtual machinePvmHostFailhost is unreachable (and thus possibly failed)DESCRIPTIONThe routine pvm_mstat returns the status mstat of the computer named host with respect to running PVM processes. This routine can be used to determine if a particular host has failed and if the virtual machine needs to be reconfigured. The function pvm_notify() can also be used to notify the caller that a host has failed. µf4K*€O l€Í€€‚€€‚‚‚ƒ‚‚‚ƒ‚‚€€‚‚‚‚‚‚‚ãA¦e‰‚ãL<‰‚ÿEXAMPLESC:mstat = pvm_mstat( "msr.ornl.gov" );Fortran:CALL PVMFMSTAT( 'msr.ornl.gov', MSTAT )ERRORSThese error conditions can be returned by pvm_mstat PvmSysErr: pvmd not responding.PvmNoHost: giving a host name not in the virtual machine.PvmHostFail: host is unreachable (and thus possibly failed).see alsiN*€ËJo pvm_notifypvm_config: iNd€1а‡ « /d€“€ì†pvm_mytid/ *€“€# €€€‚ÿpvm_mytidL d€ß‚C T€€€€‚‚‚‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚€€‚‚ÿpvm_mytid Returns the \fItid\fR of the calling process.SYNOPSISCint tid = pvm_mytid( void )Fortrancall pvmfmytid( tid )PARAMETERStidInteger returning the task identifier of the calling PVM process. Values less than zero indicate an error.DESCRIPTIONThe routine pvm_mytid enrolls this process into PVM on its first call. It also generates a unique tid if this process was not created by pvm_spawn. pvm_mytid returns the tid of the calling process and can be called multiple times in an application.i“€o…' €Ó€€‚‚‚‚ÿAny PVM system call (not just pvm_mytid) will enroll a task in PVM if the task is not enrolled before the call.The tid is a 32 bit positive integer created by the local pvmd. The 32 bits are divided into fields that encode various information about this process such as its location in the virtual machine (i.e. local pvmd address), the CPU number in the case where the process is on a multiprocessor, and a process ID field. This information is used by PVM and is not expected to be used by applications. Applications should not attempt to predict or interpret the tid with the exception of calling tidtohost()}-ß‚ì†P n€[€€‚‚‚€€‚‚‚ƒ‚‚‚ƒ‚‚€€‚‚‚‚‚ãT‰‚ãºOt‰‚‚ÿIf PVM has not been started before an application calls pvm_mytid the returned tid will be < 0.EXAMPLESC:tid = pvm_mytid( );Fortran:CALL PVMFMYTID( TID )ERRORSThis error condition can be returned by pvm_mytidPvmSysErr: pvmd not responding.see alsopvm_tidtohostpvm_parent?o…+‡1 n 0+‡_‡•Ãpvm_newcontext4ì†_‡# €"€€‚ÿpvm_newcontextÅ+‡v‰R r€‹€€€‚‚€€‚€€‚€€‚‚‚‚ƒ‚ƒ‚ƒ‚ƒ‚‚‚ƒ‚ƒ‚ƒ‚ƒ‚ÿpvm_newcontext Request new context.pvm_setcontext Change context.pvm_freecontext Free existing context.pvm_getcontext Get current context.SYNOPSISCint ctx = pvm_newcontext( void )int old_ctx = pvm_setcontext( int new_ctx )int info = pvm_freecontext( ctx )int ctx = pvm_getcontext( void )Fortrancall pvmfnewcontext( ctx )call pvmfsetcontext( new_ctx, old_ctx )call pvmffreecontext( ctx, info )call pvmfgetcontext( ctx )þÄ_‡t: B€‰€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€‚‚ÿPARAMETERSctxContext value.new_ctxNew context value.old_ctxPrior context value.infoResult code.DESCRIPTIONThe context functions provide a system-wide unique context and the means to manipulate this context. Contexts provide the ability for communicating tasks to automatically differentiate messages by the context in which they were sent. Thus a message sent in context A by the sender must be received in context A by the recipient. A sender may send in any context. However, a recipient will not accept a message sent in a context that differs from its own. One such use of contexts is with library routines. Using contexts, library routine inter-communication may be logically seperated from the user's application inter-communication. This will prevent the inadvertent receipt of one another's messages. Spawned tasks inherit the spawn-time context of their parent. Existing PVM applications work unchanged using the default context.3üv‰§7 <€ù€€‚‚‚‚‚‚‚‚‚‚‚ƒ‚ƒ‚‚ƒƒƒ‚ÿpvm_newcontext returns a newly allocated context. However, this new context is not yet active. pvm_setcontext changes the current context from old_ctx to new_ctx.pvm_freecontext frees ctx so that it may be reused. Contexts are a system resource that will be exhausted if not recycled.pvm_getcontext returns the current context of the requesting task.EXAMPLES/* parent task with context */int cc, context0, context1;char buf[25];context0 = pvm_getcontext();/* get my current context */3ötæÁ= H€í€€ƒƒƒƒƒ‚ƒ‚ƒ‚ƒƒƒ‚ƒ‚ƒ‚ƒƒƒ‚‚‚ƒ‚ÿcontext1 = pvm_newcontext(§æÁì†);/* get a new context */ pvm_setcontext(context1);/* set my context to new context */printf("My context is: %d", context1);pvm_spawn("child", (char**)0, PvmTaskDefault, "", 1, &tid);cc = pvm_recv(-1, -1);/* receive message from child - in context1 */ pvm_upkstr(buf);printf("%s", buf);pvm_setcontext(context0);/* reset my context to my original context0 *//* child task with context - child inherits parent's context as default */ int context;¯n§•ÃA P€Ý€€ƒ‚ƒ‚‚ƒ‚ƒƒƒ‚ƒƒ‚ƒ‚ƒ‚ƒ‚‚€€‚‚‚ÿint ptid;char buf[25];ptid = pvm_parent();context = pvm_getcontext();/* get my current context */sprintf(buf, "Greetings from child who's context is: %d.", context); pvm_initsend(PvmDataDefault);pvm_pkstr(buf);pvm_send(ptid, 1);ERRORSOnly system resource errors will be returned as the context programs themselves do not generate errors.; æÁÐÃ1( « XŠ 1ÐÃÄ÷Ípvm_notify0 •ÃÄ# €€€‚ÿpvm_notifyÐÐÃÆE X€¡€€€‚‚‚‚ƒ‚‚ƒ‚‚‚‚‚‚‚ƒƒƒ‚ƒƒ‚ƒƒ‚ƒƒ‚‚‚‚ÿpvm_notify Request notification of PVM event such as host failure.SYNOPSISCint info = pvm_notify( int what, int msgtag, int cnt, int *tids ) .brFortrancall pvmfnotify( what, msgtag, cnt, tids, info )PARAMETERSwhatType of event to trigger the notification. Presently one of:ValueMeaningPvmTaskExitTask exits or is killedPvmHostDeleteHost is deleted or crashesPvmHostAddNew host is addedmsgtagMessage tag to be used in notification.›kİÈ0 .€×€€‚‚‚‚‚‚‚‚‚‚‚‚‚ÿcntFor PvmTaskExit and PvmHostDelete, specifies the length of the tids array.For PvmHostAdd, specifies the number of times to notify.tidsFor PvmTaskExit and PvmHostDelete, an array of length cnt of task or pvmd TIDs to be notified about. The array is not used with the PvmHostAdd option.infoInteger status code returned by the routine. Values less than zero indicate an error.DESCRIPTIONThe routine pvm_notify requests PVM to notify the caller on detecting certain events. One or more notify messages (see below) are sent by PVM back to the calling task. The messages have tag msgtag supplied to notify.: ÆêÊ. *€€€‚‚‚‚‚‚‚‚‚‚‚ÿThe notification messages have the following format:PvmTaskExitOne notify message for each TID requested. The message body contains a single TID of exited task.PvmHostDeleteOne notify message for each TID requested. The message body contains a single pvmd-TID of exited pvmd.PvmHostAddcnt notify messages are sent, one each time the local pvmd's host table is updated. The message body contains an integer length followed by a list of pvmd-TIDs of new pvmds. The counter of PvmHostAdd messages yet to be sent isͰÈìÌ5 8€›€€‚‚‚‚‚‚‚€€‚‚‚ƒ‚ÿreplaced by successive calls to pvm_notify.Specifying a cnt of -1 turns on PvmHostAdd messages until a future notify; a count of zero disables them.TIDs in the notify messages are packed as integers. The calling task is responsible for receiving messages with the specified tag and taking appropriate action.Future versions of PVM may expand the list of available notification events.EXAMPLESC:info = pvm_notify( PvmTaskExit, 9999, ntask, tids ) ÉêÊ÷ÍB R€“€€‚‚ƒ‚‚€€‚‚‚‚‚ãÔøœ÷‰‚ãL<‰‚‚ÿFortran:CALL PVMFNOTIFY( PVMHOSTDELETE, 1111, NUMHOSTS, DTIDS, INFO )ERRORSPvmSysErr: pvmd not responding.PvmBadParam: giving an invalid argument value.see alsopvm_tasks,pvm_config: ìÌ1Î1v n þ21Î`Îl pvm_nrecv/ ÷Í`Î# €€€‚ÿpvm_nrecvÒ1ÎC T€¥€€€‚‚‚‚ƒ‚‚ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚€€‚‚ÿpvm_nrecv Non-blocking receive.SYNOPSISCint bufid = pvm_nrecv( int tid, int msgtag )Fortrancall pvmfnrecv( tid, msgtag, bufid )PARAMETERStidInteger task identifier of sending process supplied by the user.msgtagInteger message tag supplied by the user. msgtag should be >= 0.bufidInteger returning the value of the new active rec`Î÷Íeive buffer identifier. Values less than zero indicate an error.DESCRIPTIONThe routine pvm_nrecv checks to see if a message with label msgtag has arrived from tid. and also clears the current receive buffer if any, If a matching message has arrived pvm_nrecv immediately places the message in a new active receive buffer, and returns the buffer identifier in bufid.V/`Î×' €_€€‚‚‚‚ÿIf the requested message has not arrived, then pvm_nrecv immediately returns with a 0 in bufid. If some error occurs bufid will be < 0.A -1 in msgtag or tid matches anything. This allows the user the following options. If tid = -1 and msgtag is defined by the user, then pvm_nrecv will accept a message from any process which has a matching msgtag. If msgtag = -1 and tid is defined by the user, then pvm_nrecv will accept any message that is sent from process tid. If tid = -1 and msgtag = -1, then pvm_nrecv will accept any message from any process. ýØÔ% €±€€‚‚ÿThe PVM model guarantees the following about message order. If task 1 sends message A to task 2, then task 1 sends message B to task 2, message A will arrive at task 2 before message B. Moreover, if both messages arrive before task 2 does a receive, then a wildcard receive will always return message A. pvm_nrecv is non-blocking in the sense that the routine always returns immediately either with the message or with the information that the message has not arrived at the local pvmd yet. pvm_nrecv can be called multiple times to check if a given message has arrived yet. In addition the blocking receive pvm_recv can be called for the same message if the application runs out of work it could do before the data arrives.'æ×ûA P€Í€€‚‚‚‚ƒ‚ƒ‚ƒ‚ƒ‚ƒƒ‚ƒ‚ƒƒ‚‚‚ƒ‚ƒ‚ƒ‚ƒ‚ÿIf pvm_nrecv returns with the message, then the data in the message can be unpacked into the user's memory using the unpack routines. C:tid = pvm_parent();msgtag = 4 ;arrived = pvm_nrecv( tid, msgtag );if ( arrived > 0)info = pvm_upkint( tid_array, 10, 1 );else/* go do other computing */Fortran:CALL PVMFNRECV( -1, 4, ARRIVED )IF ( ARRIVED .gt. 0 ) THEN CALL PVMFUNPACK( INTEGER4, TIDS, 25, 1, INFO ) CALL PVMFUNPACK( REAL8, MATRIX, 100, 100, INFO )qÔl ` Ž€#€€ƒ‚ƒ‚ƒ‚‚€€‚‚‚‚‚‚ãÿ­A›‰‚ã0‰Jʼn‚ã¬M„#‰‚ã;Óà÷‰‚ãzº1ö‰‚ㆅ#‰‚ÿELSE* GO DO USEFUL WORKENDIFERRORSThese error conditions can be returned by pvm_nrecv.PvmBadParam: giving an invalid tid value or msgtag.PvmSysErr: pvmd not responding.see alsopvm_bufinfopvm_getmboxinfopvm_recvpvm_unpk*pvm_mcastpvm_send8û¤ 10XŠ “3¤ Ñ F‡pvm_pk*- l Ñ # €€€‚ÿpvm_pk*&ö¤ ÷ 0 .€í€€€‚‚‚‚‚‚‚‚‚‚ÿpvm_pack Pack the active message buffer with arrays of prescribed data type.SYNOPSIS C int info = pvm_packf( const char *fmt, ... ) int info = pvm_pkbyte( char *xp, int nitem, int stride ) int info = pvm_pkcplx( float *cp, int nitem, int stride ) int info = pvm_pkdcplx( double *zp, int nitem, int stride ) int info = pvm_pkdouble( double *dp, int nitem, int stride ) int info = pvm_pkfloat( float *fp, int nitem, int stride )ÝÑ þ* "€»€€‚‚‚‚‚‚‚ÿ int info = pvm_pkint( int *ip, int nitem, int stride ) int info = pvm_pkuint( unsigned int *ip, int nitem, int stride ) int info = pvm_pkushort( unsigned short *ip, int nitem, int stride ) int info = pvm_pkulong( unsigned long *ip, int nitem, int stride ) int info = pvm_pklong( long *ip, int nitem, int stride ) int info = pvm_pkshort( short *jp, int nitem, int stride ) int info = pvm_pkstr( char *sp )Y÷ cA; D€=€€‚‚‚‚‚€€‚‚‚‚‚‚‚‚‚‚‚‚‚ÿ Fortran call pvmfpack( what, xp, nitem, stride, info )PARAMETERS fmt Printf-like format expression specifying what to pack. (See discussion).nitem The total numþcAl ber of items to be packed (not the number of bytes).stride The stride to be used when packing the items. For example, if stride = 2 in pvm_pkcplx, then every other complex number will be packed.xp Pointer to the beginning of a block of bytes. Can be any data type, but must match the corresponding unpack data type..óþ‘C; D€ç€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ÿcp Complex array at least nitem*stride items long.zp Double precision complex array at least nitem*stride items long.dp Double precision real array at least nitem*stride items long.fp Real array at least nitem*stride items long.ip Integer array at least nitem*stride items long.jp Integer*2 array at least nitem*stride items long.sp Pointer to a null terminated character string.what Integer specifying the type of data being packed.í¯cA~F> J€_€€ƒƒ‚ƒƒ‚ƒ‚ƒƒ‚ƒ‚‚‚‚‚‚€€‚‚‚ÿ what options STRING 0 REAL4 4 BYTE1 1 COMPLEX8 5 INTEGER2 2 REAL8 6 INTEGER4 3 COMPLEX16 7info Integer status code returned by the routine. Values less than zero indicate an error.DESCRIPTIONEach of the pvm_pk* routines packs an array of the given data type into the active send buffer. The arguments for each of the routines are a pointer to the first item to be packed, nitem which is the total number of items to pack from this array, and stride which is the stride to use when packing.6‘C´H% €#€€‚‚ÿAn exception is pvm_pkstr() which by definition packs a NULL terminated character string and thus does not need nitem or stride arguments. The Fortran routine pvmfpack( STRING, ... ) expects nitem to be the number of characters in the string and stride to be 1.A null string ("") can be packed; this is just a string with no characters before the terminating '\0'. However, packing a null string pointer, (char *)0, is not allowed. If the packing is successful, info will be 0. If some error occurs then info will be < 0.!ù~FÕJ( €ó€€‚‚‚‚‚ÿA single variable (not an array) can be packed by setting nitem = 1 and stride = 1.The routine pvm_packf() uses a printf-like format expression to specify what and how to pack data into the send buffer. All variables are passed as addresses if count and stride are specified otherwise, variables are assumed to be values. A BNF-like description of the format syntax is: format : null | init | format fmt init : null | '%' '+' fmt : '%' count stride modifiers fchar Õ´HÞL4 6€«€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ÿ fchar : 'c' | 'd' | 'f' | 'x' | 's' count : null | [0-9]+ | '*' stride : null | '.' ( [0-9]+ | '*' ) modifiers : null | modifiers mchar mchar : 'h' | 'l' | 'u'Formats: + means initsend - must match an int (how) in the param list. c pack/unpack bytes d integers f float x complex float s stringModifiers: h short (int) l long (int, float, complex float)ͧÕJ·€& €O€€‚‚‚ÿ u unsigned (int)Future extensions to the what argument in pvmfpack will include 64 bit types when XDR encoding of these types is available. Meanwhile users should be aware that precision can be lost when passing data from a 64 bit machine like a Cray to a 32 bit machine like a SPARCstation. As a mnemonic the what argument name includes the number of bytes of precision to expect. By setting encoding to PVMRAW (see pvmfinitsend) data can be transferred between two 64 bit machines with full precision even if the PVM configuration is heterogeneous. Messages should be unpacked exactly like they were packed to insure data integrity. Packing integers and unpacking them as floats will often fail because a type encoding will have occÞL·€l urred transferring the data between heterogeneous hosts. Packing 10 integers and 100 floats then trying to unpack only 3 integers and the 100 floats will also fail. ËÞL¹‚7 <€—€€‚€€‚‚‚‚‚‚‚‚‚‚‚‚‚ÿEXAMPLES C: info = pvm_initsend( PvmDataDefault ); info = pvm_pkstr( "initial data" ); info = pvm_pkint( &size, 1, 1 ); info = pvm_pkint( array, size, 1 ); info = pvm_pkdouble( matrix, size*size, 1 ); msgtag = 3 ; info = pvm_send( tid, msgtag ); int count, *iarry; double darry[4]; pvm_packf("%+ %d %*d %4lf", PvmDataRaw, count, count, iarry, darry);L·€…4 6€1€€‚‚‚‚‚‚‚‚‚€€‚‚ÿ Fortran: CALL PVMFINITSEND(PVMRAW, INFO) CALL PVMFPACK( INTEGER4, NSIZE, 1, 1, INFO ) CALL PVMFPACK( STRING, 'row 5 of NXN matrix', 19, 1, INFO ) CALL PVMFPACK( REAL8, A(5,1), NSIZE, NSIZE , INFO ) CALL PVMFSEND( TID, MSGTAG, INFO )WARNINGSStrings cannot be packed when using the PvmDataInPlace encoding, due to limitations in the implementation. Attempting to pack a string using pvm_pkstr or pvm_packf will cause error code PvmNotImpl to be returned.¡¹‚‡b ’€C€€‚€€‚‚€€‚‚€€‚‚€€‚‚‚ãÆ$«æ‰‚ã;Óà÷‰‚ã¬M„#‰‚ㆅ#‰‚‚ÿERRORSPvmNoMem: Malloc has failed. Message buffer size has exceeded the available memory on this host.PvmNoBuf: There is no active send buffer to pack into. Try calling pvm_initsend before packing message.PvmOverflow: Attempt to pack a value too large. E.g. packing an 8-byte long with XDR encoding if the value won't fit into 4 bytes.see alsopvm_initsendpvm_unpk*pvm_recvpvm_send>…F‡/ .€€€‚‚‚‚‚‚‚‚‚‚‚‚‚ÿ; ‡‡1¤þ‘4‡±‡$‹pvm_parent0 F‡±‡# €€€‚ÿpvm_parentF‡÷‰C T€€€€‚‚‚‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚€€‚‚ÿpvm_parent Returns the tid of the process that spawned the calling process.SYNOPSISCint tid = pvm_parent( void )Fortrancall pvmfparent( tid )PARAMETERStidInteger returns the task identifier of the parent of the calling process. If the calling process was not created with pvm_spawn, then tid = PvmNoParent.DESCRIPTIONThe routine pvm_parent returns the tid of the process that spawned the calling process. If the calling process was not created with pvm_spawn, then tid is set to PvmNoParent.-$‹? L€Ý€€‚€€‚‚‚ƒ‚‚‚ƒ‚‚€€‚‚‚‚‚ÿEXAMPLESC:tid = pvm_parent();Fortran:CALL PVMFPARENT( TID )ERRORSThis error condition can be returned by pvm_parent.PvmNoParent: The calling process was not created with pvm_spawn.PvmSysErr: Can't contact local pvmd.; ÷‰_‹1_“B 5_‹‹½pvm_perror0 $‹‹# €€€‚ÿpvm_perror}7_‹ ŽF Z€o€€€‚‚‚‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚‚‚‚€€‚‚ÿpvm_perror Prints message describing the last error returned by a PVM call.SYNOPSISCint info = pvm_perror( char *msg )Fortrancall pvmfperror( msg, info )PARAMETERSmsgCharacter string supplied by the user which will be prepended to the error message of the last PVM call.infoInteger status code returned by the routine. Values less than zero indicate an error.DESCRIPTIONThe routine pvm_perror returns the error message of the last PVM call. The user can use msg to add additional information to the error message, for example, its location.±m‹½D V€Û€€‚‚‚€€‚‚‚ƒ‚ƒƒ‚‚‚ƒ‚ƒ‚‚€€‚‚‚ÿUnless redirected, all stdout and stderr messages are placed in the file /tmp/pvml. (or /%PVM_TMP%/username file on WIN32) on the master host.EXAMPLESC:if ( pvm_send( tid, msgtag ) )pvm_perror();Fortran:CALL PVMFSEND( TID, MSGTAG )IF( INFO .LT. 0 ) CALL PVMFPERROR( 'Step 6', INFO )ERRORSNo error condition is returned by pvm_perror.: Ž À1-‘W6 À;À„pvm_precv½ À½/ ½;À# €€€‚ÿpvm_precv+î ÀfÂ= H€Ý€€€‚‚‚‚ƒ‚‚ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ÿpvm_precv Receive a message directly into a buffer.SYNOPSISCint info = pvm_precv( int tid, int msgtag, char *buf, int len, int datatype, int *atid, int *atag, int *alen )Fortrancall pvmfprecv( tid, msgtag, buf, len, datatype, atid, atag, alen, info )PARAMETERStidInteger task identifier of sending process (to match).msgtagInteger message tag (to match). msgtag should be >= 0.bufPointer to a buffer to receive into.lenLength of buffer (in multiple of data type size).à;À{Ä5 8€Á€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ÿdatatypeType of data to which buf points (see below).atidReturns actual TID of sender.atagReturns actual message tag.alenReturns actual message length.infoReturns PvmOk on success. Values less than zero indicate an error.DESCRIPTIONThe routine pvm_precv blocks the process until a message with label msgtag has arrived from tid. pvm_precv then places the contents of the message in the supplied buffer, buf up to a maximum length of len * (size of data type). úfšÆ% €õ€€‚‚ÿpvm_precv can receive messages sent by pvm_psend, pvm_send, pvm_mcast, or pvm_bcast. A -1 in msgtag or tid matches anything. This allows the user the following options. If tid = -1 and msgtag is defined by the user, then pvm_precv will accept a message from any process which has a matching msgtag. If msgtag = -1 and tid is defined by the user, then pvm_precv will accept any message that is sent from process tid. If tid = -1 and msgtag = -1, then pvm_precv will accept any message from any process. ¼{Ä¢ÈL f€y€€‚‚ƒ€ƒ€‚ƒƒ‚ƒƒ‚ƒƒ‚ƒƒ‚ƒƒ‚ƒƒ‚ƒƒ‚ƒƒ‚ƒƒ‚ƒƒ‚ÿIn C the \fIdatatype\fR parameter must be one of the following, depending on the type of data to be unpacked: [Version 3.3.0 - This parameter only determines message length, not data conversion. It only unpacks raw bytes] .datatypeData TypePVM_STRstringPVM_BYTEbytePVM_SHORTshortPVM_INTintPVM_FLOATrealPVM_CPLXcomplexPVM_DOUBLEdoublePVM_DCPLXdouble complexPVM_LONGlong integerPVM_USHORTunsigned short int ۚƬÊ/ ,€·€€ƒƒ‚ƒƒ‚‚‚‚‚‚‚ÿPVM_UINTunsigned intPVM_ULONGunsigned long intIn Fortran the same data types specified for unpack should be used.The PVM model guarantees the following about message order. If task 1 sends message A to task 2, then task 1 sends message B to task 2, message A will arrive at task 2 before message B. Moreover, if both messages arrive before task 2 does a receive, then a wildcard receive will always return message A.If pvm_precv is successful, infowill be = 0.8 ¢ÈäÌ/ ,€€€‚‚‚‚‚‚‚‚‚‚‚‚ÿIf some error occurs then info will be < 0..PPpvm_precv is blocking which means the routine waits until a messagematching the user specified tid and msgtag arrives at thelocal pvmd.If the message has already arrived then pvm_precvreturns immediately with the message..PPpvm_precv does not affect the state of the current receive message buffer (created by the other receive functions)..SH WARNINGSIn some versions of PVM (CM5, I860 and PGON),messages sent using pvm_psend must be received only by pvm_precv, Ù¬ÊíÎ0 .€³€€‚‚‚‚‚‚‚‚‚‚‚‚‚ÿlikewise those sent with pvm_sendmust be received by pvm_recv, pvm_nrecv or pvm_trecv.pvm_psend is not compatible with pvm_recv(nor pvm_send with pvm_precv).In addition, pvm_probe is not interoperable with pvm_psend..PPThis problem occursbecause nonstandard message headers are used for efficiencyin the pvm_psend function.In the generic Unix version of PVM,the calls are fully interoperable..PPThe message tag space is shared between pvm_send and pvm_psend, ÓäÌ8 >€§€€‚‚‚‚‚ƒ‚‚‚‚ƒ‚‚‚‚‚‚‚‚‚‚ÿso you must be careful to avoid selecting the wrong message(for example by using a wildcard to match the message)..SH EXAMPLES.nfC:info = pvm_precv( tid, msgtag, array, cnt, PVM_FLOAT, &src,íν &rtag, &rlen );.spFortran:CALL PVMFPRECV( -1, 4, BUF, CNT, REAL4, > SRC, RTAG, RCNT, INFO ).fi.SH ERRORSThese error conditions can be returned by.I pvm_precv.IP PvmBadParamgiving an invalid tid, msgtag, or datatype.€Wí΄) "€®€€‚‚‚‚‚‚‚ÿ.IP PvmSysErrpvmd not responding..PP.SH SEE ALSOpvm_psend(3PVM),pvm_recv(3PVM): ¾1j B ˆ7¾í& pvm_probe/ „í# €€€‚ÿpvm_probe ¾÷H ^€…€€€‚‚‚‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚‚‚‚‚‚‚€€‚ÿpvm_probe Non blocking check of message arrivalSYNOPSISCint bufid = pvm_probe( int tid, int msgtag )Fortrancall pvmfprobe( tid, msgtag, bufid )PARAMETERStidInteger task identifier of sending process supplied by the user. msgtagInteger message tag supplied by the user. msgtag should be >= 0.bufidInteger returning the value of the new active receive buffer identifier. Values less than zero indicate an error.DESCRIPTIONg?í^( €€€‚‚‚‚‚ÿThe routine pvm_probe checks to see if a message with label msgtag has arrived from tid. If a matching message has arrived pvm_probe returns a buffer identifier in bufid. This bufid can be used with pvm_bufinfo to determine information about the message such as its source and length.If the requested message has not arrived, then pvm_probe returns with a 0 in bufid. If some error occurs bufid will be < 0.A -1 in msgtag or tid matches anything. This allows the user the following options. If tid = -1 and msgtag is defined by the user, then pvm_probe will accept a message from any process which has a matching msgtag. If msgtag = -1 and tid is defined by the user, then pvm_probe will accept any message that is sent from process tid. If tid = -1 and msgtag = -1, then pvm_probe will accept any message from any process. Î÷n B R€€€‚‚€€‚‚‚ƒ‚ƒ‚ƒ‚ƒ‚ƒƒ‚ƒ‚ƒƒ‚‚‚ƒ‚ÿpvm_probe can be called multiple times to check if a given message has arrived yet. After the message has arrived, pvm_recv must be called before the message can be unpacked into the user's memory using the unpack routines. EXAMPLESC:tid = pvm_parent();msgtag = 4 ;arrived = pvm_probe( tid, msgtag );if ( arrived )info = pvm_bufinfo( arrived, &len, &tag, &tid );else/* go do other computing */Fortran:CALL PVMFPROBE( -1, 4, ARRIVED )¸V^& b ’€­€€ƒ‚ƒƒ‚ƒ‚ƒƒ‚ƒ‚‚‚€€‚‚‚‚‚‚ãÿ­A›‰‚ã0‰Jʼn‚ãþ1xö‰‚ã¬M„#‰‚ã;Óà÷‰‚‚‚ÿIF ( ARRIVED .GT. 0 ) THENCALL PVMFBUFINFO( ARRIVED, LEN, TAG, TID, INFO )ELSE*GO DO USEFUL WORKENDIFERRORSThese error conditions can be returned by pvm_probe.PvmBadParam: giving an invalid tid value or msgtag.PvmSysErr: pvmd not responding.see alsopvm_bufinfopvm_getmboxinfopvm_nrecvpvm_recvpvm_unpk*: n ` 1W݇8`  ÓIpvm_psend/ &  # €€€‚ÿpvm_psend%å` ´ @ N€Ë€€€‚‚‚‚ƒ‚‚ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ÿpvm_psend Pack and send data in one call.SYNOPSISCint info = pvm_psend( int tid, int msgtag, char *buf, int len, int datatype )Fortrancall pvmfpsend( tid, msgtag, buf, len, datatype, info )PARAMETERStidInteger task identifier of destination process.msgtagInteger message tag supplied by the user. msgtag should be >= 0.bufPointer to a buffer to send.lenLength of buffer (in multiple of data type size).datatypeType of data to which buf points (see below).ì Þ@2 2€Ù€€‚‚‚‚€€‚‚‚‚‚ÿinfoInteger status code returned by the routine.DESCRIPTIONThe routine pvm_psend takes a pointer to a buffer buf its length len and its data type datatype and sends this data directly to the PVM task identified by tid. msgtag is used to label the content of the message. If pvm_psend is successful, info will be 0. If some error occurs then info will be < 0.pvm_psend data can be received by pvm_precv, pvm_recv, pvm_trecv, or pvm_nrecv.The pvm_psend routine is asynchronous. Computation on the sending processor resumes as soo´ Þ@& n as the buffer is safe for reuse. This is in contrast to synchronous communication, during which computation on the sending processor halts until the matching receive is executed by the receiving processor.Å´ ïBL f€‹€€‚‚‚‚ƒƒƒ‚ƒƒ‚ƒƒ‚ƒƒ‚ƒƒ‚ƒƒ‚ƒƒ‚ƒƒ‚ƒƒ‚ƒƒ‚ƒƒ‚ƒƒ‚ÿIn C the datatype parameter must be one of the following, depending on the type of data to be sent:[Version 3.3.0 - This parameter only determines message length, not data conversion. It only sends raw bytes]datatypeData TypePVM_STRstringPVM_BYTEbytePVM_SHORTshortPVM_INTintPVM_FLOATrealPVM_CPLXcomplexPVM_DOUBLEdoublePVM_DCPLXdouble complexPVM_LONGlong integerPVM_USHORTunsigned short intPVM_UINTunsigned int9Þ@(E+ $€€€ƒƒ‚‚‚‚‚‚ÿPVM_ULONGunsigned long intIn Fortran the same data types specified for pack should be used.The PVM model guarantees the following about message order. If task 1 sends message A to task 2, then task 1 sends message B to task 2, message A will arrive at task 2 before message B. Moreover, if both messages arrive before task 2 does a receive, then a wildcard receive will always return message A.pvm_psend does not affect the state of the current outgoing message buffer (created by pvm_initsend and used by pvm_send).<ïBdG. *€€€‚€€‚‚‚‚ÿWARNINGSIn some versions of PVM (CM5, I860 and PGON), messages sent using pvm_psend must be received only by pvm_precv, likewise those sent with pvm_send must be received by pvm_recv, pvm_nrecv or pvm_trecv. pvm_psend is not compatible with pvm_recv (nor pvm_send with pvm_precv). In addition, pvm_probe is not interoperable with pvm_psend.This problem occurs because nonstandard message headers are used for efficiency in the pvm_psend function. In the generic Unix version of PVM, the calls are fully interoperable.×(EzI? L€¯€€‚‚€€‚‚‚ƒ‚‚‚ƒ‚‚€€‚‚‚‚ÿThe message tag space is shared between pvm_send and pvm_psend, so you must be careful to avoid selecting the wrong message (for example by using a wildcard to match the message).EXAMPLESC:info = pvm_psend( tid, msgtag, array, 1000, PVM_FLOAT );Fortran:CALL PVMFPSEND( TID, MSGTAG, BUF, CNT, REAL4, INFO )ERRORSThese error conditions can be returned by pvm_psendPvmBadParam: giving an invalid tid, msgtag, or datatype.PvmSysErr: pvmd not responding.Y%dGÓI4 8€J€€‚‚ã`‡àö‰‚ㆅ#‰‚‚‚ÿsee alsopvm_precvpvm_send: zI J1fˆŸŠ9 J€³€€‚‚‚€‚‚‚‚ƒ‚ƒ‚ƒ‚ƒ‚‚‚‚ÿpvm_putinfo,pvm_recvinfo,pvm_getmboxinfo,pvm_delinfo Store and retrieve messages in global mailbox.SYNOPSISCint index = pvm_putinfo( char *name, int bufid, int flags )int bufid = pvm_recvinfo( char *name, int index, int flags )int info = pvm_delinfo( char *name, int index, int flags )int info = pvm_getmboxinfo( char *pattern, int *nclasses, struct pvmmboxinfo **classes ) struct pvmmboxinfo { char *mi_name; /* class name */ÞM €qM.üÞM:‚2 2€ù€€‚‚‚‚‚‚‚ƒ‚ƒ‚ƒ‚ƒ‚ÿ int mi_nentries; /* # of entries for this class */ int *mi_indices; /* mbox entry indices */ int *mi_owners; /* mbox entry owner tids */ int *mi_flags; /* mbox entry flags */ };Fortrancall pvmfputinfo( name, bufid, flags, index )call pvmfrecvinfo( name, index, flags, bufid )call pvmfdelinfo( name, index, flags, info )call pvmfgetmboxinfo( pattern, name, nclasses, nentries, index, owner, flags, info )Í €>„7 <€›€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ÿPARAMETERSnameDatabase key (class name), any null-terminated string. index Database key (class index), >= 0. Default index = 0.flagsUser specified options. (see below)bufidHandle of message buffer to put in database, or message returned. A returned bufid < 0 indicates an error.infoResulting status code.patternGNU regular expression (pattern) to match on names in mailbox database. Additionally, the singular "*" will match on all names.ØŸ:‚‰9 @€? €€‚‚‚‚‚‚‚‚‚‚‚‚‚€€‚‚‚ÿnclassesNumber of classes matching pattern.classesArray of pvmmboxinfo mailbox entries matching pattern.nentriesNumber of entries for a given class.ownerTask id that inserted entry into mailbox database. DESCRIPTIONThese functions implement a "message mailbox" database that can be used by PVM tasks to advertise information to other PVM tasks. An example would be to advertise names or locations of services. Another example would be to advertise a common "context" on which two tasks may communicate. The database entries are PVM messages keyed by a user specified name and an optional index value. The name may be any null-terminated string and the index a non-negative integer. The index value is assigned by PVM and is used to uniquely identify one of multiple named instances within the database. Entries are "owned" by the task that created them. An entry is automatically removed from the database when the owner task exits unless the database entry was created with flag PvmMboxPersistent. When a task exits and leaves an entry in the mailbox, the owner tid of that entry is marked as zero (0) to indicate that there is no longer an active owner task. H>„^‹. *€5€€‚€€‚‚‚‚ÿpvm_putinfo inserts a record in the database, given a key and data (message). It returns mailbox index number if the record is successfully stored, PvmExists if a record with the given key already exists, or PvmDenied if an attempt is made to overwrite a locked record. The following options are added together as the flags parameter to pvm_putinfo.PvmMboxDefaultInserts entry as the only named instance for a given name. This entry may only be modified and deleted by its owner. It is automatically deleted when its owner exits.G‰¥Ž4 6€'€€‚‚‚‚‚‚‚‚‚‚€€‚ÿPvmMboxPersistentEntry remains in the database when the owner task exits. Entries are removed from the database when PVM is halted or a reset is issued from the console.PvmMboxMultiInstancePermits multiple entry instances of the same name. PVM will assign an index key to each instance.PvmMboxOverWritablePermits other tasks to overwrite and delete this database entry.pvm_recvinfo operates just like a pvm_recv() except the message is coming from the database. The message should be unpacked after pvm_recvinfo(). Like pvm_recv, pvm_recvinfo returns a pointer to a message buffer containing the record matching the key from the database. Returned value < 0 indicates an error. The following options are added together as the flags parameter to pvm_recvinfo.uI^‹&Á, &€“€€‚‚‚‚‚‚‚‚‚ÿPvmMboxDefaultExact match on key is returned. Returns PvmNotFound if exact match not found.PvmMboxFirstAvailThe first entry in with index greater than or equal to the specified index parameter is retuned. PvmMboxFirstAvail with index = 0 will produce the same results as using¥Ž&ÁqM PvmMboxDefault.PvmMboxReadAndDeleteReturn entry and delete from database. Task must be permitted to do both read and delete otherwise an error will occur. bufid returns PvmNotFound if entry does not exist and will return PvmDenied if the record exists but may not be deleted. ݪ¥ŽÅ3 4€U€€‚€€‚‚€€‚ÿpvm_delinfo deletes database entry specified by the key . Returns PvmOK if the record was deleted, PvmNotFound if the record does not exist, or PvmDenied if an attempt is made to remove a "locked" record. There are no flags presently specified for pvm_delinfo.pvm_getmboxinfo returns an array of pvmmboxinfo for all class names in the database. This is used, for example, by programs that clean up the database or for applications to find out what is available. classes returns a pointer to the array allocated by libpvm and freed on the next call to pvm_getmboxinfo. The Fortran function returns information on one entry per call. Thus, if called repeatedly until an info value of PvmNotFound is returned, all entries matching the given pattern will have been returned. If a new pattern is desired, calling pvmfgetnames() with info = -1 will reset the entry name list and obtain a new list for the given pattern.!Ò&Á$ÇO l€¥€€‚€€‚‚‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ƒƒ‚ƒƒ‚ƒ‚‚‚ƒ‚ƒ‚ÿEXAMPLESC:/** create and insert mailbox entry*/sprintf( service, "Task_A_service" );sprintf( message, "Greetings from task A." );pvm_initsend( PvmDataDefault );pvm_pkint( &mytid, 1, 1 );pvm_pkint( &context, 1, 1 );pvm_pkstr( message );if (( pvm_putinfo( service, pvm_getsbuf(), PvmMboxDefault )) == PvmExists ){ printf( "can't register - service already running\n" );exit( -1 );}/** look for and retrieve specified mailbox ÃÅ.ÉG \€‡€€ƒ‚ƒ‚ƒƒ‚ƒƒ‚ƒƒ‚ƒƒ‚ƒƒ‚ƒ‚‚‚ƒ‚‚€€‚‚‚‚ÿ*/sprintf( service, "Task_A_service" );if (( msg_buf = pvm_recvinfo(service, 0, PvmMboxFirstAvail )) >= 0 ){ pvm_setrbuf( msg_buf );pvm_upkint( &their_tid, 1, 1 );pvm_upkint( &their_context, 1, 1 );pvm_upkstr( message );}Fortran:we need the fortran examples...ERRORSThe following error conditions can be returned by one or more of these functions: PvmBadParam: An invalid value was specified for \fIbufid\fR argument.Â$ÇñÊA P€€€‚‚‚‚‚‚‚ãÆ$«æ‰‚ã˜ÏÞm‰‚ãýk‰‚‚‚ÿPvmNoSuchBuf: Message buffer \fIbufid\fR doesn't exist.PvmNoMem: Libpvm is unable to allocate memory to pack data.PvmExists: The requested key is already in use (pvm_putinfo).PvmNotFound: The requested key does not exist (pvm_recvinfo, pvm_delinfo).PvmDenied: The key is locked by another task and cannot be replaced or deleted.see alsopvm_initsendpvm_getsbufpvm_pk*9.É*Ë1Ò ŸŠL;*ËXË5 pvm_recv. ñÊXË# €€€‚ÿpvm_recvÀw*ËÎI `€ï€€€‚‚‚‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚‚‚‚‚‚‚€€‚‚ÿpvm_recv Receive a message.SYNOPSISCint bufid = pvm_recv( int tid, int msgtag )Fortrancall pvmfrecv( tid, msgtag, bufid )PARAMETERStidInteger task identifier of sending process supplied by the user.msgtagInteger message tag supplied by the user. msgtag should be >= 0.bufidInteger returns the value of the new active receive buffer identifier. Values less than zero indicate an error.DESCRIPTIONThe routine pvm_recv blocks the process until a message with label msgtag has arrived from tid. pvm_recv then places the message in a new active receive buffer, which also clears the current receive buffer.ùÒXË ' €¥€€‚‚‚‚ÿA -1 in msgtag or tid matches anything. This allows the user the following options. If tid = -1 and msgtag is defined by the user, then pvm_recv will accept a message from any process which has a matching msgtag. If msgtag = -1 and tid is defined by the user, then pvm_recv will accept any message that is sent from process tid. If tid = -1 and msgtag = -1, then pvm_recv will accept any message from any process.The PVM model guarantees the folÎ ñÊlowing about message order. If task 1 sends message A to task 2, then task 1 sends message B to task 2, message A will arrive at task 2 before message B. Moreover, if both messages arrive before task 2 does a receive, then a wildcard receive will always return message A.ëÎ0 ( €×€€‚‚‚‚‚ÿIf pvm_recv is successful, bufid will be the value of the new active receive buffer identifier. If some error occurs then bufid will be < 0.pvm_recv is blocking which means the routine waits until a message matching the user specified tid and msgtag values arrives at the local pvmd. If the message has already arrived then pvm_recv returns immediately with the message. Once pvm_recv returns, the data in the message can be unpacked into the user's memory using the unpack routines. #Ø S K d€±€€‚€‚€‚‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚‚‚ƒ‚ƒ‚ƒ‚‚€€‚‚‚ÿEXAMPLESC:tid = pvm_parent();msgtag = 4 ;bufid = pvm_recv( tid, msgtag );info = pvm_upkint( tid_array, 10, 1 );info = pvm_upkint( problem_size, 1, 1 );info = pvm_upkfloat( input_array, 100, 1 );Fortran:CALL PVMFRECV( -1, 4, BUFID )CALL PVMFUNPACK( INTEGER4, TIDS, 25, 1, INFO )CALL PVMFUNPACK( REAL8, MATRIX, 100, 100, INFO )ERRORSThese error conditions can be returned by pvm_recvPvmBadParam: giving an invalid tid value, or msgtag < -1.â‰0 5 Y €€€€‚‚‚ãÿ­A›‰‚ã0‰Jʼn‚ãþ1xö‰‚ã;Óà÷‰‚ã^Ïàö‰‚ㆅ#‰‚ãzº1ö‰‚‚‚ÿPvmSysErr: pvmd not responding.see alsopvm_bufinfopvm_getmboxinfopvm_nrecvpvm_unpk*pvm_probepvm_sendpvm_mcast: S o 1Ç Áˆ€<o ž @@ pvm_recvf/ 5 ž # €€€‚ÿpvm_recvfÊo   8 >€•€€€‚‚‚‚ƒ‚‚ƒ‚‚€€‚‚ÿpvm_recvf Redefines the comparison function used to accept messages.SYNOPSISCint (*old)() = pvm_recvf( int (*new)( int bufid, int tid, int tag ))FortranNOT AVAILABLEDESCRIPTIONThe routine pvm_recvf defines the comparison function to be used by the pvm_recv, pvm_nrecv, and pvm_probe functions. It is available as a means to customize PVM message passing. pvm_recvf sets a user supplied comparison function to evaluate messages for receiving.Öž § 1 0€­€€‚‚‚‚‚‚‚€€‚ÿrecvf returns the old value of the matching function, or 0 if the old function was the default matcher pvm_recvf is intended for sophisticated C programmers who understand the function of such routines (like signal) and who require a receive routine that can match on more complex message contexts than the default provides.MATCHING FUNCTIONThe default comparison function evaluates the source and message tag associated with all incoming messages.PARAMETERS`   J b€-€€‚‚‚‚‚‚‚‚‚‚‚‚ƒƒ‚ƒƒ‚ƒƒ‚ƒƒ‚ƒƒ‚ƒƒ‚‚€€‚‚ÿtidInteger task identifier of sending process supplied by the user.tagInteger message tag supplied by the user.bufidInteger message buffer identifier.The matching function should return:ValueAction taken< 0Return immediately with this error code. 0Do not pick this message. 1Pick this message and do not scan the rest.> 1Pick this highest ranked message afterscanning them all.EXAMPLESImplementing message probe with recvf, using our matching function to return information in a global variable.¶§  X ~€m€€‚‚‚‚‚‚‚ƒ‚ƒ‚ƒ‚‚ƒ‚ƒ‚‚ƒ‚‚ƒƒƒ‚ƒƒ‚‚ƒ‚‚‚‚‚‚ƒ‚ƒ‚‚ƒ‚‚ƒ‚‚ƒ‚ƒƒ‚ÿ#include static int foundit = 0;static intfoo_match(mid, tid, tag)int mid;int tid;int tag;{int t, c;struct pvmminfo header;pvm_getminfo(mid, &header);if ((tid == -1 || tid == header.src) && (tag == -1 || tag == header.tag)) foundit = 1;return 0;}intprobe(src, tag){int (*omatch)();int cc;omatch = pvm_recvf(foo_match);foundit = 0;if ((cc = pvm_nrecv(src, tag)) < 0)return cc;¾ @@ a €}€€‚ƒ‚‚ƒ‚‚‚€€‚‚‚‚ãÿ­A›‰‚ã0‰Jʼn‚ã¬M„#‰‚ãþ1xö‰‚ã^Ïàö‰‚ã$2±÷‰‚‚‚ÿpvm_recvf(omatch);return foundit;}ERRORSNo error conditions are returned by pvm_recvfsee alsopvm_bufinfopvm_getmboxinfo @@ 5 pvm_recvpvm_nrecvpvm_probepvm_trecv=  }@ 1nL#€=}@ ¯@ ì@ pvm_recvinfo2@@ ¯@ # €€€‚ÿpvm_recvinfo=}@ ì@ ) "€(€€ãkÙ9‰‚ÿsee pvm_putinfo; ¯@ 'A 1`€‰>'A WA ­Š pvm_reduce0 ì@ WA # €€€‚ÿpvm_reduce_$'A ¶C ; D€I€€€‚‚‚‚‚‚‚‚‚‚‚€€‚‚‚‚ÿpvm_reduce Performs a reduction operation over members of the specified group. SYNOPSISC int info = pvm_reduce( void (*func)(), void *data, int count, int datatype, int msgtag, char *group, int rootginst)Fortran call pvmfreduce(func, data, count, datatype, msgtag, group, rootginst, info)PARAMETERSfuncFunction which defines the operation performed on the global data. Predefined are PvmMax, PvmMin, PvmSum, and PvmProduct. Users can define their own function.<WA òE , &€!€€‚‚‚‚‚‚‚‚‚ÿSYNOPSIS for func C void func(int *datatype, void *x, void *y, int *num, int *info) Fortran call func(datatype, x, y, num, info)data Pointer to the starting address of an array of local values. On return, the data array on the root will be overwritten with the result of the reduce operation over the group. For the other (non-root) members of the group the values of the data array upon return from the reduce operation are not defined; the values may be different than those originally passed to pvm_reduce. Ú¶C ûG / ,€µ€€‚‚‚‚‚‚‚‚‚‚‚‚ÿcountInteger specifying the number of elements of datatype in the data array. The value of count should agree between all members of the group. datatype Integer specifying the type of the entries in the data array. (See below for defined types.)msgtag Integer message tag supplied by the user. msgtag should be >= 0. It allows the user's program to distinguish between different kinds of messages.group Character string group name of an existing group.&ùòE !J - (€ó€€‚‚‚‚‚‚‚‚‚‚ÿrootginst Integer instance number of group member who gets the result.info Integer status code returned by the routine. Values less than zero indicate an error.DESCRIPTIONpvm_reduce() performs global operations such as max, min, sum, or a user provided operation on the data provided by the members of a group. All group members call pvm_reduce with the same size local data array which may contain one or more entries. The root task is identified by its instance number in the group. áûG /L - (€Ã€€‚‚‚‚‚‚‚‚‚‚ÿThe inner workings of the pvm_reduce call are implementation dependent; however, when the pvm_reduce call completes, the root's data array will be equal to the specified operation applied element-wise to the data arrays of all the group members.A broadcast by the root can be used if the other members of the group need the resultant value(s).PVM supplies the following predefined functions that can be specified in func. PvmMin PvmMax PvmSum á!J =N - (€Ã€€‚‚‚‚‚‚‚‚ƒ‚ÿ PvmProduct PvmMax and PvmMin are implemented for all the datatypes listed below. For complex values the minimum [maximum] is that complex pair with the minimum [maximum] modulus. PvmSum and PvmProduct are implemented for all the datatypes listed below with the exception of PVM_BYTE and BYTE1.C and Fortran defined datatypes are: C datatypes FORTRAN datatypes ----------------------------------- PVM_BYTE BYTE1 ئ/L ! 2 2€M€€ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚‚‚‚ÿ PVM_SHORT INTEGER2 PVM_INT INTEGER4 PVM_FLOAT REAL4 PVM_CPLX COMPLEX8 PVM_DOUBLE REAL8 PVM_DCPLX COMPLEX16 PVM_LONG A user defined function may be used in func. The argument func is a function with four arguments. It is the base=N ! ì@ function used for the reduction operation. Both x and y are arrays of type specified by datatype with num entries. The arguments datatype and info are as specified above. The arguments x and num correspond to data and count above. The argument y contains received values. ìÇ=N „ % €€€‚‚ÿCaveat: pvm_reduce() does not block, a call to pvm_barrier may be necessary.For example, an error may occur if a task calls pvm_reduce and then leaves the group before the root has completed its call to pvm_reduce. Similarly, an error may occur if a task joins the group after the root has issued its call to pvm_reduce. Synchronization of the tasks (such as a call to pvm_barrier) was not included within the pvm_reduce implementation since this overhead is unnecessary in many user codes (which may already synchronize the tasks for other purposes). The current algorithm is very simple and robust. A future implementation may make more efficient use of the architecture to allow greater parallelism.A! N† 3 4€€€‚€€‚‚‚‚‚‚‚‚‚ÿILLUSTRATIONThe following example illustrates a call to pvm_reduce. Suppose you have three group members (instance numbers 0, 1, 2) with an array called Idata with 5 values as specified: instance the 5 values in the integer array 0 1, 2, 3, 4, 5 1 10, 20, 30, 40, 50 2 100, 200, 300, 400, 500And, suppose that a call to reduce (such as the ones following) are issued where the root is the group member with instance value of 1: Û „ Zˆ 1 0€·€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚ÿ C: root = 1; info = pvm_reduce(PvmSum, &Idata, 5, PVM_INT, msgtag, "worker", root); Fortran: root = 1 call pvmfreduce(PvmSum, Idata, 5, INTEGER4, msgtag, "worker", root, info)Then, upon completion of the reduce call, the following will result: instance the 5 values in the integer array 0 .... not defined....... 1 111, 222, 333, 444, 555 2 .... not defined ......»N† ]Š H ^€w€€‚€€‚‚‚‚‚‚‚‚‚€€‚‚‚‚‚‚‚‚ãßäóó‰‚ÿEXAMPLESC: info = pvm_reduce(PvmMax, &myvals, 10, PVM_FLOAT, msgtag, "worker", rootginst);Fortran: CALL PVMFREDUCE(PvmMax, MYVALS, COUNT, REAL4, MTAG, 'worker', ROOT, INFO)ERRORSThese error conditions can be returned by pvm_reducePvmNoInst: Calling task is not in the groupPvmBadParam: The datatype specified is not appropriate for the specified reduction function.PvmSysErr: Pvm system errorsee alsopvm_bcastPZˆ ­Š 2 4€<€ã• ‚㺿áö‰‚‚‚ÿpvm_barrierpvm_psend?]Š ìŠ 1‘ #€[†?ìŠ ‹ uÇ pvm_reg_hoster4­Š ‹ # €"€€‚ÿpvm_reg_hosterù»ìŠ Ž > J€w€€€‚‚‚‚ƒ‚‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚ÿpvm_reg_hoster Register task as PVM slave starter.SYNOPSISC#include int cc = pvm_reg_hoster()FortranNot AvailableDESCRIPTIONRegisters the calling task as a PVM slave pvmd starter. When the master pvmd receives a DM_ADD message, instead of starting the new slave pvmd processes itself, it passes a message to the hoster, which does the dirty work and sends a message back to the pvmd.Note: This function isn't for beginners. If you don't grok what it does, you probably don't need it. For a more complete explanation of what's going on here, you should refer to the PVM source code and/or user guide section on implementation; this is just a man page. That said....ú ‹ SÀ 4 6€õ€€‚‚‚‚ƒƒ‚ƒ‚ƒƒƒ‚ƒƒƒ‚ÿWhen the master pvmd receives a DM_ADD message (request to add hosts to the virtual machine), it looks up the new host IP addresses, gets parameters from the host file if it was started with one, and sets default parameters. It then either attempts to start the processes (using rsh or rexec()) or, if a hoster has registered, sends it a SM_STHOST message.The format of the SM_STHOST message is:int nhosts// number of hosts{Ž SÀ ­Š int tid// of hoststring options// from hostfile \fIso=\fR fieldOŽ ¢Â 6 :€3€€ƒƒƒ‚ƒƒƒ‚ƒ‚‚‚ƒ‚‚ƒ‚‚‚ÿstring login// in form ``[username@]hostname.domain''string command// to run on remote host} [nhosts]The hoster should attempt to run each command on each host and record the result. A command usually looks like:$PVM_ROOT/lib/pvmd -s -d8 -nhonk 1 80a9ca95:0f5a 4096 3 80a95c43:0000and a reply from a slave pvmd like:ddpro<2312> arch ip<80a95c43:0b3f> mtu<4096>When finished, the hoster should send a SM_STHOSTACK message back to the address of the sender (the master pvmd). The format of the reply message is:ÌSÀ ¨Ä : B€™€€‚ƒ‚ƒƒƒ‚ƒƒƒ‚ƒƒ‚‚‚‚‚‚‚‚‚‚ÿ{int tid// of host, must match requeststring status// result line from slave or error code} []// implied countThe TIDs in the reply must match those in the request. They may be in a different order, however.The result string should contain the entire reply (a single line)from each new slave pvmd,or an error code if something went wrong.Legalerror codes are the literal names of the \fIpvm_errno\fR codes,for example ``PvmCantStart''.(ü¢Â ÐÆ , &€ù€€‚‚‚‚‚‚‚‚‚ÿThe default PVM hoster can return PvmDSysErr or PvmCantStart,and the slave pvmd itself can return PvmDupHost.The hoster must use \fIpvm_setmwid()\fR to set the wait ID in the reply message to the same value as in the request.The wait ID in the request is obtained by calling \fIpvm_getmwid()\fR.The hoster taskmust use pvm_setopt(PvmResvTids, 1) to allow sending reserved messages. Messages should be packed using encoding \fIPvmDataDefault\fR toensure they can be unpacked anywhere in the system.¥z¨Ä uÇ + &€ô€€‚‚‚‚‚‚‚‚‚ÿpvm_reg_hoster()returns PvmOk when successful..SH SEE ALSOpvm_addhosts(3PVM),pvm_config(3PVM),pvm_setmwid(3PVM); ÐÆ °Ç 1§ ‰Š@°Ç àÇ = pvm_reg_rm0 uÇ àÇ # €€€‚ÿpvm_reg_rmWÿ°Ç 7Í X ~€ÿ €€€‚‚‚‚ƒ‚‚ƒ‚‚ƒ‚ƒƒ‚ƒƒ‚ƒƒ‚ƒƒ‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚€€‚‚‚ÿpvm_reg_rm Register task as PVM resource manager.SYNOPSISC#include int cc = pvm_reg_rm( struct pvmhostinfo **hip )struct pvmhostinfo {int hi_tid;char *hi_name;char *hi_arch;int hi_speed;};FortranNot AvailablePARAMETERShostpReturns pointer to a pvmhostinfo structure which contains information about the master host.DESCRIPTIONRegisters the calling task as a PVM task and slave host manager. This means it intercepts certain libpvm calls from other tasks in order to have a say in scheduling policy. The resource manager will asynchronously receive messages from tasks containing requests for service, as well as messages from pvmds notifying it of system failures. Before you start using this function, be warned that it's not a trivial thing, i.e. you can't just call it to turn off the default round-robin task assignment. Rather, it allows you to write your own resource manager and hook it to PVM. To understand what the following messages mean, you should refer to the PVM source code and/or user guide section on implementation; There's just too much to say about them. When one of the following libpvm functions is called in a task with resource manager set, the given message tag is sent to to resource manager. ¸àÇ >Ï O l€q€€‚ƒƒƒƒƒƒ‚ƒƒƒ‚ƒƒƒ‚ƒƒƒ‚ƒƒƒ‚ƒƒƒ‚ƒƒƒ‚‚‚‚ƒƒ‚ƒƒ‚ƒƒ‚ÿLibpvm callRM messageNormal message pvm_addhosts()SM_ADDHOSTTM_ADDHOSTpvm_config()SM_CONFIGTM_CONFIGpvm_delhosts()SM_DELHOSTTM_DELHOSTpvm_notify()SM_NOTIFYTM_NOTIFYpvm_spawn()SM_SPAWNTM_SPAWNpvm_tasks()SM_TASKTM_TASKpvm_reg_rm()SM_SCHEDTM_SCHEDThe resource manager must in turn compose the following messages and send them to the pvmds:RM messageNormal messageSM_EXECDM_EXECSM_EXECACKDM_EXECACKÝ7Í a : B€»€€ƒƒ‚ƒƒ‚ƒƒ‚‚‚‚ƒƒ‚ƒƒ‚ƒƒ‚‚‚ÿSM_ADDDM_ADDSM_ADDACKDM_ADDACKSM_HANDOFF(none - change of resource manager)The following messages are sent asynchronously to >Ï a uÇ the resource manager by the system:RM messageMeaningSM_TASKXnotify of task exit/failSM_HOSTXnotify of host delete/failThe resource manager task must use pvm_setopt(PvmResvTids, 1) to allow sending reserved messages. Messages should be packed using encoding PvmDataDefault to ensure they can be unpacked anywhere in the system. ÜŠ>Ï = R r€€€‚‚‚ã„”Z³‰‚ãL<‰‚ã®×0O‰‚ãA¦e‰‚ã½€z÷‰‚ãÔøœ÷‰‚‚‚ÿpvm_reg_rm() returns PvmOk when successful.see alsopvm_addhostspvm_configpvm_delhostspvm_notifypvm_spawnpvm_tasks?a | 1r [†Ä A| ° ñ pvm_reg_tasker4= ° # €"€€‚ÿpvm_reg_tasker8ú| è > J€õ€€€‚‚‚‚ƒ‚‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚ÿpvm_reg_tasker Register task as PVM task starter.SYNOPSISC#include int cc = pvm_reg_tasker()FortranNot Available.SH DESCRIPTIONRegisters the calling task as a PVM task starter. When a tasker is registered with a pvmd, and the pvmd receives a DM_EXEC message, instead of fork()ing and exec()ing the task itself, it passes a message to the tasker, which does the dirty work and sends a message back to the pvmd.Note: If this doesn't make sense, don't worry about it. This function is for folks who are writing stuff like debugger servers and so on. For a more complete explanation of what's going on here, you should refer to the PVM source code and/or user guide section on implementation; this is only a man page. That said...ç°  7 <€Ï€€‚‚‚‚‚ƒƒƒ‚ƒƒƒ‚ƒƒ‚ƒƒƒ‚ÿWhen the pvmd receives a DM_EXEC message (request to exec new tasks), it searches epath (the PVM executable search path) for the file name. If it finds the file, it then either attempts to start the processes (using fork() and exec()) or, if a tasker has registered, sends it a SM_STTASK message.The format of the SM_STTASK message is:int tid// of taskint flags// as passed to spawn()string path// absolute path of the executableint argc// number of args to process>è D / ,€€€ƒƒ‚ƒƒƒ‚ƒƒ‚‚‚ÿstring argv[argc]// argsint nenv// number of envars to pass to taskstring env[nenv]// environment stringsThe tasker must attempt to start the process when it gets one of these messages. The tasker doesn't reply to the pvmd if the task is successfully started; the task will reconnect to the pvmd on its own, using the cookie in envar PVMEPID to identify itself to the pvmd. The tasker must send a SM_TASKX message to the pvmd when any task that it owns (has started) exits, or if it can't start a particular task. â d > J€Å€€‚‚‚ƒƒƒ‚ƒƒƒ‚ƒƒƒ‚ƒƒ‚ƒƒƒ‚ƒƒ‚‚‚ÿThe format of the SM_TASKX message is:int tid// of taskint status// the Unix exit status (from \fIwait()\fR)int u_sec// user time used by the task, secondsint u_usec// microsecondsint s_sec// system time used by the task, secondsint s_usec// microsecondsThe tasker task must use pvm_setopt(PvmResvTids, 1) to allow sending reserved messages. Messages should be packed using encoding PvmDataDefault to ensure they can be unpacked anywhere in the system. WD ñ 6 <€®€€‚‚‚‚ã½€z÷‰‚ãÔøœ÷‰‚‚‚ÿpvm_reg_tasker() returns PvmOk when successful.see alsopvm_spawnpvm_tasks< d - 1|ЉB- ^ L pvm_scatter1ñ ^ # €€€‚ÿpvm_scatter6þ- ” 8 >€ý€€€‚‚‚‚‚‚‚‚€€‚‚‚‚ÿpvm_scatter Sends to each member of a group a section of an array from a specified member of the group.SYNOPSISC int info = pvm_scatter( void *result, void *data, int count, int datatype, int msgtag, char *group, int rootginst)Fortran call pvmfscatter(result, data, count, datatype, msgtag, group, rootginst, info)PARAMETERSresultPointer to the starting address of an array of length count of datatype which will be overwritten by the message from the specified root member of the group.N"^ îA , &€E€€‚‚‚‚‚‚‚‚‚ÿdata On the root this is a pointer to the starting address of” îA ñ an array datatype of local values which are to be distributed to the members of the group. If n is the number of members in the group, then this array of datatype should be of length at least n* count. This argument is meaningful only on the root.countInteger specifying the number of elements of datatype to be sent to each member of the group from the root.datatype Integer specifying the type of the entries in the result and data arrays. (See below for defined types.)Ô” üC : B€©€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€‚‚‚ÿmsgtag Integer message tag supplied by the user. msgtag should be >= 0. It allows the user's program to distinguish between different kinds of messages.group Character string group name of an existing group.rootginstInteger instance number of group member who performs the scatter of its array to the members of the group.info Integer status code returned by the routine. Values less than zero indicate an error.DESCRIPTIONpvm_scatter() ŠfîA †F $ €Í€€‚ÿperforms a scatter of data from the specified root member of the group to each of the members of the group, including itself. All group members must call pvm_scatter(), each receives a portion of the data array from the root in their local result array. It is as if the root node sends to the ith member of the group count elements from its array data starting at offset i* count from the beginning of the data array. And, it is as if, each member of the group performs a corresponding receive of count values of datatype into its result array. The root task is identified by its instance number in the group.³züC 9I 9 @€õ€€‚‚‚‚‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚‚‚‚ÿC and Fortran defined datatypes are: C datatypes FORTRAN datatypes ----------------------------------- PVM_BYTE BYTE1 PVM_SHORT INTEGER2 PVM_INT INTEGER4 PVM_FLOAT REAL4 PVM_CPLX COMPLEX8 PVM_DOUBLE REAL8 PVM_DCPLX COMPLEX16 PVM_LONGIn using the scatter and gather routines, keep in mind that C stores multidimensional arrays in row order, typically starting with an initial index of 0; whereas, Fortran stores arrays in column order, typically starting with an offset of 1. Ó†F IK = H€§€€‚‚€€‚‚‚‚‚‚‚‚‚€€‚‚‚ÿThe current algorithm is very simple and robust. A future implementation may make more efficient use of the architecture to allow greater parallelism.EXAMPLESC: info = pvm_scatter(&getmyrow, &matrix, 10, PVM_INT, msgtag, "workers", rootginst);Fortran: CALL PVMFSCATTER(GETMYCOLUMN, MATRIX, COUNT, INTEGER4, MTAG, 'workers', ROOT, INFO)ERRORSThese error conditions can be returned by pvm_scatter PvmNoInst: Calling task is not in the groupº~9I L < H€ü€€‚‚‚ãßäóó‰‚ã• 㺿áö‰‚‚‚ÿPvmBadParam: The datatype specified is not appropriatePvmSysErr: Pvm system errorpvm_bcastpvm_barrierpvm_psend9IK = 0.infoInteger status code returned by the routine.DESCRIPTIONThe routine pvm_send sends a message stored in the active send buffer to the PVM process identified by tid. msgtag is used to label the content of the message. If pvm_send is successful, info will be 0. If some error occurs then info will be < 0.¤~jL Ñ & €ý€€‚‚‚ÿThe pvm_send routine is asynchronous. Computation on the sending processor resumes as soon as the message is safely on its way to the receiving processor. This is in contrast to sync!O Ñ L hronous communication, during which computation on the sending processor halts until the matching receive is executed by the receiving processor. The PVM model guarantees the following about message order. If task 1 sends message A to task 2, then task 1 sends message B to task 2, message A will arrive at task 2 before message B. Moreover, if both messages arrive before task 2 does a receive, then a wildcard receive will always return message A. 3ì!O „ G \€Ù€€‚‚€€‚‚‚ƒ‚ƒ‚ƒ‚ƒ‚‚‚ƒ‚ƒ‚ƒ‚‚€€‚‚ÿTerminating a PVM task immediately after sending a message or messages from it may result in those messages being lost. To be sure, always call pvm_exit() before stopping. EXAMPLESC:info = pvm_initsend( PvmDataDefault );info = pvm_pkint( array, 10, 1 );msgtag = 3 ;info = pvm_send( tid, msgtag );Fortran:CALL PVMFINITSEND(PVMRAW, INFO)CALL PVMFPACK( REAL8, DATA, 100, 1, INFO )CALL PVMFSEND( TID, 3, INFO )ERRORSThese error conditions can be returned by pvm_send(ÛÑ ,… M h€·€€‚‚‚‚‚ãÆ$«æ‰‚ãzº1ö‰‚ãýk‰‚㺿áö‰‚ã¬M„#‰‚‚‚ÿPvmBadParam: giving an invalid tid or a msgtag.PvmSysErr: pvmd not responding.PvmNoBuf: no active send buffer. Try pvm_initsend() before send.see alsopvm_initsendpvm_mcastpvm_pk*pvm_psendpvm_recv< „ h… 1Á‰±Dh… ™… )‹ pvm_sendsig1,… ™… # €€€‚ÿpvm_sendsigR h… ë‡ I `€€€€‚‚‚‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚‚‚‚‚‚‚€€‚‚ÿpvm_sendsig Sends a signal to another PVM process.SYNOPSISCint info = pvm_sendsig( int tid, int signum )Fortrancall pvmfsendsig( tid, signum, info )PARAMETERStidInteger task identifier of PVM process to receive the signal.signumInteger signal number.infoInteger status code returned by the routine.DESCRIPTIONThe routine pvm_sendsig sends the signal number signum to the PVM process identified by tid. If pvm_sendsig is successful, info will be 0. If some error occurs then info will be < 0.à™… Š 5 8€Á€€‚‚‚‚‚€€‚‚‚ƒ‚ƒ‚ÿpvm_sendsig should only be used by programmers with Unix signal handling experience. Many library functions (and in fact the PVM library functions) cannot be called in a signal handler context because they do not mask signals or lock internal data structures. Further caveat: the signal numbers passed between systems are notmapped - PVM assumes that signal 9 on one system is the same as on another.EXAMPLESC:tid = pvm_parent();info = pvm_sendsig( tid, SIGKILL);)óë‡ )‹ 6 :€ç€€‚‚ƒ‚ƒ‚‚€€‚‚‚‚‚‚ÿFortran:CALL PVMFBUFINFO( BUFID, BYTES, TYPE, TID, INFO );CALL PVMFSENDSIG( TID, SIGNUM, INFO )ERRORSThese error conditions can be returned by pvm_sendsigPvmSysErr: pvmd not responding.PvmBadParam: giving an invalid tid value.; Š d‹ 1»Ç€Ed‹ ”‹ ³À pvm_serror0 )‹ ”‹ # €€€‚ÿpvm_serror‚<d‹  F Z€y€€€‚‚‚‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚‚‚‚€€‚‚ÿpvm_serror Sets automatic error message printing on or off. [In Version 3.2: Replaced by pvm_setopt]SYNOPSISCint oldset = pvm_serror( int set )Fortrancall pvmfserror( set, oldset )PARAMETERSsetInteger defining whether detection is to be turned on (1) or off (0).oldsetInteger defining the previous setting of pvm_serror.DESCRIPTIONThe routine pvm_serror sets automatic error message printing for all subsequent PVM calls by this process. Any PVM routines that return an error condition will automatically print the associated error message. The argument set defines whether this detection is to be turned on (1) or turned off (0) for subsequent calls. In the future a value of (2) will cause the program to exit after printing the error message. pvm_serror returns the previous value of set in oldset.‘J”‹ ³À G \€•€€‚‚€€‚‚‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚ã¿l‰‚‚ÿAll stdout and stderr messages are placed in the file /tmp/pvml. (%PVM_TMP%/pvml.username) on the master pvmd's host.EXAMPLESC:info = pvm_serror( 1 ) ³À )‹ ;Fortran:CALL PVMFSERROR( 0, INFO )ERRORSThis error condition can be returned by pvm_serrorPvmBadParam: giving an invalid set value.see alsopvm_setopt? òÀ 1q±(€FòÀ &Á fÁ pvm_setcontext4³À &Á # €"€€‚ÿpvm_setcontext@òÀ fÁ ) "€.€€ãéZb‰‚ÿsee pvm_newcontext< &Á ¢Á 1€Á„G¢Á ÓÁ !Ç pvm_setmwid1fÁ ÓÁ # €€€‚ÿpvm_setmwide¢Á 8Ä Q p€)€€€‚€€‚‚‚‚‚‚ƒ‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚‚‚‚€€‚‚ÿpvm_getmwid,pvm_setmwid Get or set wait ID of a message.[In Version 3.4: Relaced by pvm_getminfo and pvm_setminfo]SYNOPSISCint info = pvm_getmwid( int bufid )int info = pvm_setmwid( int bufid, int waitid )FortranNot AvailablePARAMETERSbufidMessage buffer identifier.waitidWait identifier number.DESCRIPTIONA wait identifier is part of a message (like the source, destination, tag and body). It is used to match a reply to the corresponding request. The default wait ID for a message is zero (none).8õÓÁ pÆ C T€ë€€‚‚‚‚‚‚‚€€‚‚ƒ‚‚ƒ‚ƒ‚ƒƒ‚ƒ‚ƒ‚‚‚‚ÿpvm_getmwid returns the wait ID associated with a message buffer, or a negative error code.pvm_setmwid assigns a new wait ID to a message buffer.It returns PvmOk unless an error occurs.EXAMPLESint src, tag;pvm_recv(-1, -1);/* ... process, compose reply message */ pvm_setmwid(pvm_getsbuf(), pvm_getmwid(pvm_getrbuf())); pvm_bufinfo(pvm_getrbuf(), (int *)0, &tag, &src);pvm_send(src, tag);ERRORSThe following error conditions can be returned by pvm_getmwid or pvm_setmwid:±‚8Ä !Ç / ,€€€‚‚‚‚‚ãÿ­A›‰‚ÿPvmBadParam: Invalid value for bufid argument.PvmNoSuchBuf: Message buffer \fIbufid\fR doesn't exist.see alsopvm_bufinfo; pÆ \Ç 1Ÿ(€ ‚H\Ç ŒÇ éC pvm_setopt0 !Ç ŒÇ # €€€‚ÿpvm_setoptBñ\Ç ÎÉ Q p€ã€€€‚‚‚‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚ƒƒƒ‚ƒƒ‚ƒƒƒ‚ƒƒƒ‚ƒƒ‚ƒƒƒ‚ÿpvm_setopt Sets libpvm options.SYNOPSISCint oldval = pvm_setopt( int what, int val )Fortrancall pvmfsetopt( what, val, oldval )PARAMETERSwhatInteger defining what to set. One of:PvmRoute1Message routing policyPvmDebugMask 2 Libpvm debug maskPvmAutoErr 3 Auto error reportingPvmOutputTid 4 Stdout destination for childrenPvmOutputCode 5 Output message tagPvmTraceTid 6 Trace data destination for children+íŒÇ ùË > J€Û€€ƒƒ‚ƒƒƒ‚ƒƒ‚ƒƒ‚ƒƒ‚ƒƒ‚ƒƒƒ‚ƒƒƒ‚ÿPvmTraceCode 7 Trace message tagPvmFragSize 8 Message fragment sizePvmResvTids 9 Allow messages to reserved tags and TIDs PvmSelfOutputTid 10 Stdout destinationPvmSelfOutputCode 11 Output message tagPvmSelfTraceTid 12 Trace data destinationPvmSelfTraceCode 13 Trace message tagPvmShowTids 14 pvm_catchout prints task ids with outputPvmPollType 15 Message wait policy (shared memory)BÎÉ ;Î ; D€€€ƒƒƒ‚‚‚‚‚ƒƒ‚ƒƒƒ‚ƒƒ‚‚‚‚‚‚‚ÿPvmPollTime 16 Message spinwait durationvalInteger specifying new setting of option. Predefined values for PvmRoute are:PvmDontRoute 1 Don't request or grant connectionsPvmAllowDirect 2 (Default) Don't request but allowPvmRouteDirect 3 Request and allow connectionsoldvalInteger returning the previous setting of the option.DESCRIPTIONThe routine pvm_setopt is a general purpose function used to set miscellaneous options in the PVM library. What is one of:ý×ùË D & €¯€€‚‚‚ÿPvmRouteAdvises PVM on whether to set up direct task-to-task links. PvmRouteDirect (using TCP) for all subsequent communication. Once a link is established it persists until the application finishes. If a direct link can not be established because one of the two tasks has requested PvmDontRoute or because adequate resources aren't available, then the default route through the PVM daemons is used. On multiproc;Î D !Ç essors such as Intel Paragon this option is ignored because the communication between tasks on these machines always uses the native protocol for direct communication. pvm_setopt can be called multiple times to selectively establish direct links, but is typically set only once near the beginning of each task.E;Î ‰ , &€3€€‚‚‚‚‚‚‚‚‚ÿPvmAllowDirectis the default route setting. This setting on task A allows other tasks to set up direct links to A. Once a direct link is established between tasks both tasks will use it for sending messages.PvmDebugMaskWhen debugging is turned on, PVM will log detailed information about its operations and progress on its stderr stream. val is the debugging level. Default is not to print any debug information.PvmAutoErrWhen an error results from a libpvm function call and PvmAutoErr is set to 1 (the default), an error message is automatically printed on stderr. A setting of 0 disables this. A setting of 2 causes the library to terminate the task by calling exit() after printing the error message. A setting of 3 causes the library to abort after printing the error message. a8D ê ) €q€€‚‚‚‚‚‚ÿPvmOutputTidSets the stdout destination for children tasks (spawned after the call to pvm_setopt). Everything printed on the standard output of tasks spawned by the calling task is packed into messages and sent to the destination. val is the TID of a PVM task. Setting PvmOutputTid to 0 redirects stdout to the master pvmd, which writes to the log file /tmp/pvml. The default setting is inherited from the parent task, else is 0.PvmOutputCodeSets the message tag for standard output messages. Should only be set when a task has PvmOutputTid set to itself.L ‰ 6 , &€A€€‚‚‚‚‚‚‚‚‚ÿPvmTraceTidSets the trace data message destination for children tasks (spawned after the call to pvm_setopt). Libpvm trace data is sent as messages to the destination. val is the TID of a PVM task. Setting PvmTraceTid to 0 discards trace data. The default setting is inherited from the parent task, else is 0.PvmTraceCodeSets the message tag for trace data messages. Should only be set when a task has PvmTraceTid set to itself.PvmFragSizeVal specifies the message fragment size in bytes. Default value varies with host architecture.…[ê » * "€·€€‚‚‚‚‚‚‚ÿPvmResvTidsA val of 1 enables the task to send messages with reserved tags and to non-task destinations. The default (0) causes libpvm to generate a PvmBadParam error when a reserved identifier is specified.PvmSelfOutputTidSets the stdout destination for the task. Everything printed on stdout is packed into messages and sent to the destination.Note: this only works for spawned tasks, because the pvmd doesn't get the output from tasks started by other means. val is the TID of a PVM task. Setting PvmSelfOutputTid to 0 redirects stdout to the master pvmd, which writes to the log file /tmp/pvml.. The default setting is inherited from the parent task, else is 0. Setting either PvmSelfOutputTid or PvmSelfOutputCode also causes both PvmOutputTid and PvmOutputCode to take on the values of PvmSelfOutputTid and PvmSelfOutputCode, respectively.16 ì ) €€€‚‚‚‚‚‚ÿPvmSelfOutputCodeSets the message tag for standard output messages.PvmSelfTraceTidSets the trace data message destination for the task.Libpvm trace data is sent as messages to the destination. val is the TID of a PVM task. Setting PvmSelfTraceTid to 0 discards trace data. The default setting is inherited from the parent task, else is 0. Setting either PvmSelfTraceTid or PvmSelfTraceCode also causes both PvmTraceTid and PvmTraceCode to take on the values of PvmSelfTraceTid and PvmSelfTraceCode, respectively.e9» ]A , &€s€€‚‚‚‚‚‚‚‚‚ÿPvmSelfTraceCodeSets the message tag for trace data messages.PvmShowTidsIf true (nonzero), pvm_catchout tags each line of output printed by a child task with the task id. Otherwise, output is exactly as printed.PvmPollTypeSì ]A !Ç ets the message wait policy when using shared-memory message transport. Setting PvmPollType to PvmPollConstant causes the application to spin on its message queue waiting for a message. Setting PvmPollType to PvmPollSleep causes the application to poll the message queue for messages PvmPollTime times before pending on the semaphore. !áì ~C @ N€Ã€€‚‚‚‚‚‚€€‚‚‚ƒ‚‚ƒ‚‚€€‚‚ÿPvmPollTimeSets the poll count for applications checking their message queue before they pend on the semaphore. This option is ignored if PvmPollType is set to PvmPollConstant.pvm_setopt returns the previous value of the option. If an error occurs, the PVM error code is returned in place of the option value.EXAMPLESC:oldval = pvm_setopt( PvmRoute, PvmRouteDirect );Fortran:CALL PVMFSETOPT( PVMAUTOERR, 1, OLDVAL )ERRORSThis error condition can be returnedk?]A éC , (€~€€‚‚‚ãûF&‰‚ÿPvmBadParam: giving an invalid value.see alsopvm_getopt< ~C %D 1cÁ„°‡I%D VD ˆJ pvm_setrbuf1éC VD # €€€‚ÿpvm_setrbuf±k%D G F Z€×€€€‚‚‚‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚‚‚‚€€‚‚ÿpvm_setrbuf Switches the active receive buffer and saves the previous buffer.SYNOPSISCint oldbuf = pvm_setrbuf( int bufid )Fortrancall pvmfsetrbuf( bufid, oldbuf )PARAMETERSbufidInteger specifying the message buffer identifier for the new active receive buffer.oldbufInteger returning the message buffer identifier for the previous active receive buffer.DESCRIPTIONThe routine pvm_setrbuf switches the active receive buffer to bufid and saves the previous active receive buffer oldbuf. If bufid is set to 0 then the present active receive buffer is saved and no active receive buffer exists. %VD ,I $ €€€‚ÿA successful receive automatically creates a new active receive buffer. If a previous receive has not been unpacked and needs to be saved for later, then the previous bufid can be saved and reset later to the active buffer for unpacking. The routine is required when managing multiple message buffers. For example switching back and forth between two buffers. One buffer could be used to send information to a graphical interface while a second buffer could be used send data to other tasks in the application.\G ˆJ F Z€-€€‚€€‚‚‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚‚ã™Ým‰‚ÿEXAMPLESC:rbuf1 = pvm_setrbuf( rbuf2 );Fortran:CALL PVMFSETRBUF( NEWBUF, OLDBUF )ERRORSThese error conditions can be returned by pvm_setrbufPvmBadParam: giving an invalid bufid.PvmNoSuchBuf: switching to a non-existent message buffer.see alsopvm_getrbuf< ,I ÄJ 1l ‚JÄJ õJ <€ pvm_setsbuf1ˆJ õJ # €€€‚ÿpvm_setsbuf¥_ÄJ šM F Z€¿€€€‚‚‚‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚‚‚‚€€‚‚ÿpvm_setsbuf Switches the active send buffer.SYNOPSISCint oldbuf = pvm_setsbuf( int bufid )Fortrancall pvmfsetsbuf( bufid, oldbuf )PARAMETERSbufidInteger the message buffer identifier for the new active send buffer. A value of 0 indicates the default receive buffer.oldbufInteger returning the message buffer identifier for the previous active send buffer.DESCRIPTIONThe routine pvm_setsbuf switches the active send buffer to bufid and saves the previous active send buffer oldbuf. If bufid is set to 0 then the present active send buffer is saved and no active send buffer exists.ÕõJ ¬O = H€«€€‚‚€€‚‚‚ƒ‚‚ƒ‚‚€€‚‚‚ÿThe routine is required when managing multiple message buffers. For example switching back and forth between two buffers. One buffer could be used to send information to a graphical interface while a second buffer could be used send data to other tasks in the application.EXAMPLESC:sbuf1 = pvm_setsbuf( sbuf2 );Fortran:CALL PVMFSETSBUF( NEWBUF, OLDBUF )ERRORSThese error conditions can be returned by pvm_setsbufPvmBadParam: giving an invalid bufid.„VšM <€ . ,€¬€€‚‚‚ãñ½A‰‚‚‚ÿPvmNoSuchBuf: switching to a non-exis¬O <€ ˆJ tent message buffer.see alsopvm_setrbuf= ¬O y€ 1o°‡ê Ky€ «€ éŽ pvm_settmask2<€ «€ # €€€‚ÿpvm_settmask†:y€ 1ƒ L f€u€€‚€‚‚‚‚ƒ‚ƒ‚‚ƒ‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚ƒƒ‚ƒƒ‚‚‚‚ÿpvm_gettmask,pvm_settmask Get or set trace mask of a task or its children..SH SYNOPSISC#include #include int info = pvm_gettmask( int who, Pvmtmask mask )int info = pvm_settmask( int who, Pvmtmask mask )FortranNot AvailablePARAMETERSwhoSpecifies which trace mask to get or set:PvmTaskSelfThe current taskPvmTaskChildChildren tasks to be spawnedmaskTrace mask (owned by caller), which is filled in with the current trace vector on calling pvm_gettmask or used to set the current trace vector on calling pvm_settmask.Ì«€ 3… 6 :€™€€‚‚‚‚€€‚ã¿l‰‚‚ÿinfoStatus code returned. Values less than zero indicate an error.DESCRIPTIONEach task has a trace mask, which can be used to individually enable tracing of each libpvm function. The mask is inherited from its parent task (or initially all cleared if the task has no parent). When calls are made to functions in libpvm, the parameters and results are sent in messages to the trace sink of the task (variable PvmTraceTid set by calling pvm_setopt).—o1ƒ ʇ ( €ß€€‚ƒ‚‚‚ÿThe PVM console and XPVM use this system to get trace data from application programs. A task can get or set either its own trace mask, or the mask passed to children it spawns. Note the mask must be set before the spawn call; setting the child trace mask has no effect on already-running children. The trace mask can be kept in a temporary variable, declared as: Pvmtmask mymask;Right now, this is a character array with approximately 80 bits. There are four macros defined to manipulate trace masks. Along with the functions, these allow a program to get the current trace mask, modify or save it, and put it back:(ø3… òŠ 0 .€ñ€€‚ƒ‚ƒ‚ƒ‚ƒ‚‚‚‚‚ÿTEV_INIT_MASK(mask)TEV_SET_MASK(mask, kind)TEV_UNSET_MASK(mask, kind)TEV_CHECK_MASK(mask, kind)TEV_INIT_MASK initializes a mask to all bits cleared and must be used to initialize a trace mask (unless that is done by setting it from pvm_gettmask). TEV_SET_MASK sets a bit in a mask. Bit values are defined in . Likewise, TEV_UNSET_MASK clears a single bit and TEV_CHECK_MASK checks to see if a bit is set, returning nonzero if true. Note:Most events in the trace mask come in pairs, the first (ending in ...0) is generated on entry to a function and the second (...1) on exit. The trace mask has only half as many bits as there are events; events are enabled in pairs. In other words, if you select TEV_SEND0, you'll also get TEV_SEND1.ßʇ  6 :€¿€€‚‚‚ƒ‚‚‚‚€€‚‚‚ƒ‚ÿThe trace mask is deliberately kept as a printable (and null-terminated) string, for two reasons. First, it is passed through the environment between tasks, in the form:PVMTMASK=@@AAOG@@NO@L@@@@@@@@so the pvmd doesn't have to explicitly manage it. Second, the mask variables can be passed between tasks using pvm_pkstr() or otherwise manipulated as strings. pvm_gettmask and pvm_settmask return PvmOk on success, else a negative value.EXAMPLESC:#include âòŠ éŽ S t€€€ƒ‚‚ƒ‚‚ƒ‚ƒ‚ƒ‚ƒ‚‚€€‚‚‚‚‚ã}$ቂã¿l‰‚ãûF&‰‚‚ÿ#include Pvmtmask m;pvm_gettmask( PvmTaskChild, m );TEV_SET_MASK(m, TEV_ADDHOSTS0 );pvm_settmask( PvmTaskChild, m );pvm_spawn( "worker", (char **)0, PvmTaskDefault, "", 1, (int *)0);ERRORSThe following error condition can be returned by pvm_gettmask or pvm_settmask:PvmBadParam: invalid value for \fIwho\fR argument.see alsopvm consolepvm_setoptpvm_getopt=  & 1™ o†L& X É pvm_siblings2éŽ X # €€€‚ÿpvm_siblingsŽN& òÁ @ N€€€€‚‚‚‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚‚‚‚‚‚ÿpvm_siblings return the number and associated task ids of processes that were started together in a sX òÁ éŽ ingle spawn call. SYNOPSISCint ntids = pvm_siblings( int **tids )Fortrancall pvmfsiblings( ntids, index, sibling )PARAMETERSntidsReturns the number of tids that were spawned together. Value less than 0 indicates an error. tidsPointer to the array of tids that contains the siblings. Indexed from 0 to (ntids - 1)index Integer index of tid to be returned in sibling. If index is set to -1, then sibling is unchanged. Otherwise, must be in the range [0, ntids - 1] ûÌX íÄ / ,€™€€‚‚‚‚€€‚‚ÿsibling When index is in the range [0, ntids -1], this contains the tid of the desired index.DESCRIPTIONThe routine pvm_siblings returns the number of tasks and a list of task ids of processes that were spawned together in a single spawn call. The spawning task multicasts the list of successful to the spawned tasks so that each task has an identical copy of the sibling list. pvm_siblings uses local storage to keep the list of tids and does not update this list when sibling tasks exit the virtual machine. The FORTRAN version allows calling programs read a particular index in the internal sibling array. If pvm_siblings is successful, ntids will be > 0. If some error occurs then ntids will be < 0.`9òÁ MÇ ' €s€€‚‚‚‚ÿpvm_siblings is designed to simplify the logic in static spmd-style programs. By giving tasks an identical list of tids and its size, programs may self size and treat the sibling as static map between instances and tasks. The internal list is not updated when sibling tasks exit the virtual machine and should be treated as a snapshot of the parallel program when it was first started. If a task was started by pvm_spawn, then pvm_siblings will return ntids = 1 and ntids = 1 and tids will contain a single entry identical to the task id returned by pvm_mytid() ÉjíÄ É _ Œ€Õ€€‚‚€€‚‚‚ƒ‚ƒ‚‚ƒ‚ƒ‚ƒ‚ƒ‚‚€€‚‚‚‚‚ã½€z÷‰‚ã™òLö‰‚ãºOt‰‚‚‚‚ÿEXAMPLESC:int *tids;ntids = pvm_siblings(&tids);Fortran:INTEGER TIDS(0:MAXNPROC)CALL PVMFSIBLINGS(NTIDS, -1, IDUM)DO I = 0, NTIDS-1 CALL PVMFSIBLINGS(NTIDS, I, TIDS(I))ERRORSpvm_siblings can return the following error codesPvmNoTask: No task at that index, or index is invalid.see alsopvm_spawnpvm_mytidpvm_parent: MÇ PÉ 1…ê €MPÉ É fB pvm_spawn/ É É # €€€‚ÿpvm_spawn7PÉ ¶Ë 4 6€€€€‚‚‚‚ƒ‚‚ƒ‚‚‚‚‚‚ÿpvm_spawn Starts new PVM processes.SYNOPSISCint numt = pvm_spawn( char *task, char **argv, int flag, char *where, int ntask, int *tids )Fortrancall pvmfspawn( task, flag, where, ntask, tids, numt )PARAMETERStaskCharacter string which is the executable file name of the PVM process to be started. The executable must already reside on the host on which it is to be started. The name may be a file in the PVM search path or an absolute path. The default PVM search path is $HOME/pvm3/bin/$PVM_ARCH/ .çÉ ÈÍ + $€Ï€€‚‚‚‚‚‚‚‚ÿargvPointer to an array of arguments to the executable (if supported on the target machine), not including the executable name, with the end of the array specified by NULL. argv[0] of the spawned task is set to the executable path relative to the PVM working directory (or absolute if an absolute filename was specified). If the executable needs no arguments, then the second argument to pvm_spawn is NULL.flagInteger specifying spawn options.In C, flag should be the sum of:Ì¶Ë ÚÏ F Z€™€€‚ƒƒƒ‚ƒƒƒƒƒƒƒƒƒƒƒƒ‚ƒƒƒƒƒƒ‚ƒƒƒ‚‚‚ƒƒƒ‚ÿOption valueMEANINGPvmTaskDefault0PVM can choose any machine to start task PvmTaskHost1\fIwhere\fR specifies a particular host PvmTaskArch2\fIwhere\fR specifies a type of architecture PvmTaskDebug4Start up processes under debuggerPvmTaskTrace8Processes will generate PVM trace data. * PvmMppFront16Start process on MPP front-end.PvmHostCompl32Use complement host setIn Fortran, flag should be the sum of:Option valueMEANINGr7ÈÍ X ; D€o€€ƒƒƒƒÚÏ X É ƒƒ‚ƒƒƒ‚ƒƒƒ‚ƒƒƒ‚‚‚‚‚‚ÿPVMDEFAULT0PVM can choose any machine to start task PVMHOST1\fIwhere\fR specifies a particular hostPVMARCH2\fIwhere\fR specifies a type of architecturePVMDEBUG4Start up processes under debuggerPVMTRACE8Processes will generate PVM trace data. ** future extensionwhereCharacter string specifying where to start the PVM process. Depending on the value of flag, where can be a host name such as ``ibm1.epm.ornl.gov'' or a PVM architecture class such as ``SUN4''. If flag is 0, then where is ignored and PVM will select the most appropriate host.:ÚÏ ’ 5 8€ €€‚‚‚‚‚‚‚‚‚‚€€‚‚ÿntaskInteger specifying the number of copies of the executable to start.tidsInteger array of length ntask returning the tids of the PVM processes started by this pvm_spawn call. numtInteger returning the actual number of tasks started. Values less than zero indicate a system error. A positive value less than ntask indicates a partial failure. In this case the user should check the tids array for the error code(s).DESCRIPTIONThe routine pvm_spawn starts ntask copies of the executable named task. On systems that support environment, spawn passes selected variables from parent environment to children tasks. If set, the envar PVM_EXPORT is passed. If PVM_EXPORT contains other names (separated by ':') they will be passed too. This is useful for e.g.: ÌŸX ^ - (€?€€‚‚ƒ‚ƒ‚ƒ‚‚‚ÿsetenv DISPLAY myworkstation:0.0setenv MYSTERYVAR 13setenv PVM_EXPORT DISPLAY:MYSTERYVARThe hosts on which the PVM processes are started are determined by the flag and where arguments. On return the array tids contains the PVM task identifiers for each process started. If pvm_spawn starts one or more tasks, numt will be the actual number of tasks started. If a system error occurs then numt will be < 0. If numt is less than ntask then some executables have failed to start and the user should check the last ntask - numt locations in the tids array which will contain error codes (see below for meaning). The first numt tids in the array are always valid. €Z’ Þ & €µ€€‚‚‚ÿWhen flag is set to 0 and where is set to NULL (or ``*'' in Fortran) a heuristic (round-robin assignment) is used to distribute the ntask processes across the virtual machine. If the PvmHostCompl flag is set, the resulting host set gets complemented. Also, the TaskHost hostname "." is taken as localhost. These can be used, for example, to spawn n - 1 tasks on host "." with flags TaskHost|HostCompl to get all but the localhost.In the special case where a multiprocessor is specified by where, pvm_spawn will start all ntask copies on this single machine using the vendor's underlying routines. „Z^ b * "€µ€€‚ƒ‚ƒ‚‚‚ÿThe spawned task will have argv[0] set to the the executable path relative to its inherited working directory (or possibly an absolute path), so the base filename can be got by using: char *p;p = (p = rindex(argv[0], '/')) ? p + 1 : argv[0];If PvmTaskDebug is set, then the pvmd will start the task(s) under debugger(s). In this case, instead of executing pvm3/bin/ARCH/task args it executes pvm3/lib/debugger pvm3/bin/ARCH/task args. debugger is a shell script that the users can modify to their individual tastes. Presently the script starts an xterm with dbx or comparable debugger in it. +ëÞ  @ N€×€€‚€€‚‚‚ƒ‚ƒ‚ƒ‚‚ƒ‚ƒ‚ƒ‚‚‚ƒ‚ƒ‚ÿEXAMPLESC:numt = pvm_spawn( "host", 0, PvmTaskHost, "sparky", 1, &tid[0] );numt = pvm_spawn( "host", 0, (PvmTaskHost+PvmTaskDebug), sparky", 1, &tid[0] );numt = pvm_spawn( "node", 0, PvmTaskArch, "RIOS", 1, &tid[i] );char *args[] = { "12", "60" , (char*)0 };numt = pvm_spawn( "FEM1", args, 0, 0, 16, tids );numt = pvm_spawn( "pde", 0, PvmTaskHost, "paragon.ornl", 512, tids );Fortran:FLAG = PVMARCH + PVMDEBUGCALL PVMFSPAWN( 'node', FLAG, 'SUN4', 1, TID(3), NUMT ) Ùb ¥A 3 4€³€€ƒ‚ƒ‚‚€€‚‚‚‚‚ÿCALL PVMFSPAWN( 'FEM1', PVMDEFAULT, '*', 16, TIDS, NUMT )CAL ¥A É L PVMFSPAWN( 'TBMD', PVMHOST, 'cm5.utk.edu', 32, TIDS, NUMT )ERRORSThese error conditions can be returned by pvm_spawn either in numt or in the tids array.PvmBadParam: giving an invalid argument value.PvmNoHost: Specified host is not in the virtual machine.PvmNoFile: Specified executable cannot be found. The default location PVM looks in is ~/pvm3/bin/ARCH, where ARCH is a PVM architecture name. Á fB 2 2€€€‚‚‚‚‚㲊š‰‚‚‚‚ÿPvmNoMem: Malloc failed. Not enough memory on host.PvmSysErr: pvmd not responding.PvmOutOfRes: out of resources.see alsopvm_export?¥A ¥B 1Èo†n†N¥B ÙB pI pvm_start_pvmd4fB ÙB # €"€€‚ÿpvm_start_pvmdØ¥B ÷D F Z€±€€€‚‚‚‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ÿpvm_start_pvmd Starts new PVM daemon.SYNOPSISCint info = pvm_start_pvmd( int argc, char **argv, int block )Fortrancall pvmfstartpvmd( args, block, info )PARAMETERSargcNumber of arguments in argv.argvAn array of arguments to the executable.argsA character string containing the arguments to the executable.blockInteger specifying whether to block until startup of all hosts complete or return immediately.infoInteger returning the error code.˜lÙB G , &€Ù€€‚€€‚‚ÿDESCRIPTIONThe routine pvm_start_pvmd starts up a pvmd3 process, the master of a new virtual machine. It returns as soon as the pvmd is started and ready for work. If the block parameter is nonzero and a hostfile is passed to the pvmd as a parameter, it returns when all hosts marked to start have been added. pvm_start_pvmd returns zero on success. If PVM is compiled to allow running more than one pvmd per host, calling pvm_start_pvmd before any other pvm functions will connect to the pvmd that it starts. pvm_start_pvmd sets environment variable PVMSOCK to the address printed by the pvmd as it starts up.áŠ÷D pI W |€€€‚€€‚‚‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚‚‚ƒ‚‚‚‚‚‚‚‚ã„”Z³‰‚ã›®tö‰‚‚ƒƒƒ‚ÿEXAMPLESC:static char *argv[] = { "-d41", "/u/jones/pvmd_hosts",};argc = 2info = pvm_start_pvmd( argc, argv, block );Fortran:CALL PVMFSTART_PVMD( '-d41 /u/jones/pvmd_hosts', BLOCK, INFO )The following error conditions can be returnedPvmDupHost: pvmd is already running.PvmSysErr: The local pvmd is not responding.see alsopvm_addhostspvmd3 daemon : G ªI 1Ë € OªI ÙI "… pvm_tasks/ pI ÙI # €€€‚ÿpvm_tasks½ªI ÛK E X€{€€€‚‚‚‚ƒ‚‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚‚ƒ‚‚‚‚‚‚‚‚ÿpvm_tasks Returns information about the tasks running on the virtual machine.SYNOPSISCint info = pvm_tasks( int where, int *ntask, struct pvmtaskinfo **taskp )struct pvmtaskinfo {int ti_tid;int ti_ptid;int ti_host;int ti_flag;char *ti_a_out;} taskp;Fortrancall pvmftasks( where, ntask, tid, ptid, dtid, flag, aout, info ) PARAMETERSwhereInteger specifying what tasks to return information about.The options are:ÑÙI ÞM 2 2€£€€ƒƒ‚ƒƒ‚ƒƒ‚‚‚‚‚‚‚ÿ 0for all the tasks on the virtual machinepvmd tidfor all tasks on a given host tidfor a specific taskntaskInteger returning the number of tasks being reported on.taskpReturns pointer to an array of structures which contain information about each task including its task ID, parent tid, pvmd task ID, status flag, and the name of this task's executable file. The status flag values are: waiting for a message, waiting for the pvmd, and running. ¯qÛK ™‚ > J€ã€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€‚‚ÿtidInteger returning task ID of one taskptidInteger returning parent task IDdtidInteger returning pvmd task ID of host task is on.flagInteger returning status of taskaoutCharacter string returning the name of spawned task. Manually started tasks return blank.infoInteger status code returned by the routine. Values less than zero indicate an error.DESCRIPTIONThe routine pvm_tasks returns information about tasks presently running on the virtual machine. The inÞM ™‚ pI formation returned is the same as that available from the console command ps. The C function returns information about the entire virtual machine in one call. The Fortran function returns information about one task per call and cycles through all the tasks. Thus, if where = 0, and pvmftasks is called ntask times, all tasks will be represented. Note that in Fortran the reported value of ntask and the set of tasks do not change until the function resets at the end of a complete cycle. The user can reset pvmftasks() at any time by calling it with ntask = -1. If pvm_tasks is successful, info will be 0. If some error occurs then info will be < 0. .âÞM Ç„ L f€Å€€‚€€‚‚‚ƒ‚ƒ‚‚ƒ‚ƒ‚ƒƒ‚‚ƒ‚ƒ‚ƒ‚‚€€‚‚‚‚‚ÿEXAMPLESC:struct pvmtaskinfo *taskp;int i, ntask;info = pvm_tasks( 0, &ntask, &taskp );for (i = 0; i < ntask; i++)printf("t%x\\n", taskp[i].ti_tid);Fortran:Do i=1, NTASK CALL PVMFTASKS( DTID, NTASK, TID(i), PTID(i), DTID(i), FLAG(i), AOUT(i), INFO )EndDoERRORSThe following error condition can be returned by pvm_tasksPvmBadParam: invalid value for where argument.PvmSysErr: pvmd not responding.PvmNoHost: specified host not in virtual machine.[)™‚ "… 2 4€R€€‚‚ãL<‰‚ãT‰‚ÿsee alsopvm_configpvm_tidtohost> Ç„ `… 1n†kP`… “… fˆ pvm_tidtohost3"… “… # € €€‚ÿpvm_tidtohost)Ú`… ¼‡ O l€µ€€€‚‚‚‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚‚‚‚€€‚‚‚€€‚‚ÿpvm_tidtohost Returns the host of the specified PVM process.SYNOPSISCint dtid = pvm_tidtohost( tid )Fortrancall pvmftidtoh( tid, dtid )PARAMETERStidInteger task identifier of the PVM process in question.dtidInteger returns the tid of the host's pvmd3 or a negative value if an error.DESCRIPTIONThe routine pvm_tidtohost returns the host id on which the process identified by tid is located.ERRORSThe following error conditions can be returnedªv“… fˆ 4 8€ì€€‚‚‚‚ãÔøœ÷‰‚ãL<‰‚ÿPvmBadParam: An invalid tid value was specified.PvmSysErr: pvmd not responding.see alsopvm_taskspvm_config: ¼‡  ˆ 1/ -…Q ˆ ψ Æ pvm_trecv/ fˆ ψ # €€€‚ÿpvm_trecvH ˆ ‹ E X€€€€‚‚‚‚ƒ‚ƒ‚‚ƒ‚‚€€‚‚‚‚‚‚‚‚‚‚‚‚‚ÿpvm_trecv Receive with timeout.SYNOPSISC#include int bufid = pvm_trecv( int tid, int msgtag, struct timeval *tmout )Fortrancall pvmftrecv( tid, msgtag, sec, usec, bufid )PARAMETERStidInteger to match task identifier of sending process.msgtagInteger to match message tag; should be >= 0.tmout (or sec and usec)Time to wait before returning without a message.bufidInteger returns the value of the new active receive buffer identifier. Values less than zero indicate an error.Ô§ψ ë - (€O€€‚€€‚‚‚ÿDESCRIPTIONThe routine pvm_trecv blocks the process until a message with label msgtag has arrived from tid. pvm_trecv then places the message in a new active receive buffer, also clearing the current receive buffer. If no matching message arrives within the specified waiting time, pvm_trecv returns without a message. A -1 in msgtag or tid matches anything. This allows the user the following options. If tid = -1 then pvm_trecv will accept a message from any process which has a matching msgtag. If msgtag = -1 then pvm_trecv will accept any message that is sent from process tid. If tid and msgtag are both -1, then pvm_trecv will accept any message from any process. å‹ À $ €Ë€€‚ÿIn C, the tmout fields tv_sec and tv_usec specify how long pvm_trecv will wait without returning a matching message. In Fortran, two separate parameters, sec and usec are passed. With both set to zero, pvm_trecv behaves the same as pvm_nrecv, which is to probe for messages and return immediately even if none are matched. In C, passing a null pointer in tmout makes pvm_trecv act like pvm_recv, that is, it will wait indefinitely. In Fortran, setting sec to -1 has the same effect.ë À fˆ æë  & €Í€€‚‚‚ÿThe PVM model guarantees the following about message order. If task 1 sends message A to task 2, then task 1 sends message B to task 2, message A will arrive at task 2 before message B. Moreover, if both messages arrive before task 2 does a receive, then a wildcard receive will always return message A. If pvm_trecv is successful, bufid will be the new active receive buffer identifier. If no message is received, pvm_trecv returns 0. If some error occurs then bufid will be < 0. ¾ À Ä I `€}€€‚‚€€‚‚‚ƒ‚‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ƒƒ‚ƒƒ‚ƒƒ‚ƒ‚‚ƒ‚ÿOnce pvm_trecv returns, the data in the message can be unpacked into the user's memory using the unpack routines.EXAMPLESC:struct timeval tmout;tid = pvm_parent();msgtag = 4 ;tmout.tv_sec = 60;tmout.tv_usec = 0;if ((bufid = pvm_trecv( tid, msgtag, &tmout )) > 0) {pvm_upkint( tid_array, 10, 1 );pvm_upkint( problem_size, 1, 1 );pvm_upkfloat( input_array, 100, 1 );}Fortran:CALL PVMFTRECV( -1, 4, 60, 0, BUFID )ö‰ Æ m ¨€€€ƒ‚ƒ‚ƒ‚ƒ‚‚‚‚€€‚‚‚‚‚‚ãÿ­A›‰‚ãþ1xö‰‚ã¬M„#‰‚ã;Óà÷‰‚ã^Ïàö‰‚ㆅ#‰‚ãzº1ö‰‚‚‚ÿIF (BUFID .EQ. 0) GO TO 666CALL PVMFUNPACK( INTEGER4, TIDS, 25, 1, INFO )CALL PVMFUNPACK( REAL8, MATRIX, 100, 100, INFO )666CONTINUEERRORSThese error conditions can be returned by pvm_trecv PvmBadParam: giving an invalid tid value, or msgtag < -1.PvmSysErr: pvmd not responding.see alsopvm_bufinfopvm_nrecvpvm_recvpvm_unpk*pvm_probepvm_sendpvm_mcast= Ä RÆ 1mkO…RRÆ „Æ ÀÆ pvm_unexport2Æ „Æ # €€€‚ÿpvm_unexport<RÆ ÀÆ ) "€&€€㲊š‰‚ÿsee pvm_export: „Æ úÆ 1A-…ÿÿÿÿSúÆ )Ç A pvm_unpk*/ ÀÆ )Ç # €€€‚ÿpvm_unpk**ùúÆ SÉ 1 0€ó€€€‚‚‚‚‚‚‚‚‚‚‚ÿpvm_unpack Unpack the active message buffer into arrays of prescribed data type.SYNOPSIS C int info = pvm_unpackf( const char *fmt, ... ) int info = pvm_upkbyte( char *xp, int nitem, int stride) int info = pvm_upkcplx( float *cp, int nitem, int stride) int info = pvm_upkdcplx( double *zp, int nitem, int stride) int info = pvm_upkdouble( double *dp, int nitem, int stride) int info = pvm_upkfloat( float *fp, int nitem, int stride) á)Ç ^Ë * "€Ã€€‚‚‚‚‚‚‚ÿ int info = pvm_upkint( int *ip, int nitem, int stride) int info = pvm_upkuint( unsigned int *ip, int nitem, int stride ) int info = pvm_upkushort( unsigned short *ip, int nitem, int stride ) int info = pvm_upkulong( unsigned long *ip, int nitem, int stride ) int info = pvm_upklong( long *ip, int nitem, int stride) int info = pvm_upkshort( short *jp, int nitem, int stride) int info = pvm_upkstr( char *sp )WSÉ µÍ ; D€9€€‚‚‚‚‚€€‚‚‚‚‚‚‚‚‚‚‚‚‚ÿ Fortran call pvmfunpack( what, xp, nitem, stride, info )PARAMETERS fmt Printf-like format expression specifying what to pack. (See discussion)nitem The total number of items to be unpacked (not the number of bytes).stride The stride to be used when packing the items. For example, if stride = 2 in pvm_upkcplx, then every other complex number will be unpacked.xp Pointer to the beginning of a block of bytes. Can be any data type, but must match the corresponding pack data type.1ö^Ë ; D€í€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ÿcp Complex array at least nitem*stride items long.zp Double precision complex array at least nitem*stride items long.dp Double precision real array at least nitem*stride items long.fp Real array at least nitem*stride items long.ip Integer array at least nitem*stride items long.jp Integer*2 array at least nitem*stride items long.sp Pointer to a null terminated character string.what Integer specifying the type of data being unpacked.µÍ ÀÆ á¢µÍ í ? L€E€€‚‚ƒƒ‚ƒƒ‚ƒƒ‚ƒ‚‚‚‚‚‚‚€€‚‚‚ÿ what options STRING 0 REAL4 4 BYTE11 COMPLEX8 5 INTEGER2 2 REAL8 6 INTEGER4 3 COMPLEX16 7info Integer status code returned by the routine. Values less than zero indicate an error.DESCRIPTIONEach of the pvm_upk* routines unpacks an array of the given data type from the active receive buffer. The arguments for each of the routines are a pointer to the array to be unpacked into, nitem which is the total number of items to unpack, and stride which is the stride to use when unpacking.Ó« À ( €W€€‚‚‚‚‚ÿAn exception is pvm_upkstr() which by definition unpacks a NULL terminated character string and thus does not need nitem or stride arguments. The Fortran routine pvmfunpack( STRING, ... ) expects nitme to be the number of characters in the string and stride to be 1.If the unpacking is successful, info will be 0. If some error occurs then info will be < 0.A single variable (not an array) can be unpacked by setting nitem = 1 and stride = 1.The routine pvm_unpackf() uses a printf-like format expression to specify what and how to unpack data from the receive buffer. All variables are passed as addresses. A BNF-like description of the format syntax is: Øí Ê 2 2€±€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ÿ format : null | init | format fmt init : null | '%' '+' fmt : '%' count stride modifiers fchar fchar : 'c' | 'd' | 'f' | 'x' | 's' count : null | [0-9]+ | '*' stride : null | '.' ( [0-9]+ | '*' ) modifiers : null | modifiers mchar mchar : 'h' | 'l' | 'u'Formats: + means initsend - must match an int (how) in the param list. c pack/unpack bytes d integer f floatN!À  - (€C€€‚‚‚‚‚‚‚‚‚‚ÿ x complex float s stringModifiers: h short (int) l long (int, float, complex float) u unsigned (int)Future extensions to the what argument in pvmfunpack will include 64 bit types when XDR encoding of these types is available. Meanwhile users should be aware that precision can be lost when passing data from a 64 bit machine like a Cray to a 32 bit machine like a SPARCstation. As a mnemonic the what argument name includes the number of bytes of precision to expect. By setting encoding to PVMRAW (see pvmfinitsend) data can be transferred between two 64 bit machines with full precision even if the PVM configuration is heterogeneous. Messages should be unpacked exactly like they were packed to insure data integrity. Packing integers and unpacking them as floats will often fail because a type encoding will have occurred transferring the data between heterogeneous hosts. Packing 10 integers and 100 floats then trying to unpack only 3 integers and the 100 floats will also fail. ÔÊ & : B€©€€‚‚€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ÿEXAMPLES C: info = pvm_recv( tid, msgtag ); info = pvm_upkstr( string ); info = pvm_upkint( &size, 1, 1 ); info = pvm_upkint( array, size, 1 ); info = pvm_upkdouble( matrix, size*size, 1 ); int count, *iarry; double darry[4]; pvm_unpackf("%d", &count); pvm_unpackf("%*d %4lf", count, iarry, darry); Fortran: CALL PVMFRECV( TID, MSGTAG, INFO );ƒ? µ@ D V€€€‚‚‚‚€€‚‚€€‚‚€€ã“v;ö‰‚ÿ CALL PVMFUNPACK( INTEGER4, NSIZE, 1, 1, INFO ) CALL PVMFUNPACK( STRING, STEPNAME, 8, 1, INFO ) CALL PVMFUNPACK( REAL4, A(5,1), NSIZE, NSIZE , INFO )ERRORS PvmNoData: Reading beyond the end of the receive buffer. Most likely cause is trying to unpack more items than were originally packed into the buffer.PvmBadMsg: The received message can not be decode& µ@ ÀÆ d. Most likely because the hosts are heterogeneous and the user specified an incompatible encoding. Try setting the encoding to PvmDataDefault (see pvm_mkbuf ).Ø€& A X ~€€€‚€€‚‚‚ãýk‰‚ㆅ#‰‚ã¬M„#‰‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ÿPvmNoBuf: There is no active receive buffer to unpack.see alsopvm_pk*pvm_send pvm_recvFµ@ ÓA 1€TÓA B ùB PVM Fortran Interface;A B # €0€€‚ÿPVM Fortran InterfaceëÄÓA ùB ' €‰€€‚‚‚‚ÿThe Fortran Interface maps the PVM calls placed in a Fortran program with the lipvm3 library written in C.Fortran is more restrictive than C and a few functionalities are missing in Fortran.= B 6C 1oÿÿÿÿ€U6C hC ¦C pvmfaddhosts2ùB hC # €€€‚ÿpvmfaddhosts>6C ¦C ) "€*€€ã„”Z³‰‚ÿsee pvm_addhosts; hC áC 1m\ VáC D MD pvmfaddmhf0 ¦C D # €€€‚ÿpvmfaddmhf<áC MD ) "€&€€ãàækñ‰‚ÿsee pvm_addmhf; D ˆD 1m€ÀWˆD ¸D ôD pvmfadvise0 MD ¸D # €€€‚ÿpvmfadvise<ˆD ôD ) "€&€€ã*¢ñ‰‚ÿsee pvm_advise= ¸D 1E 1o äX1E cE ¡E pvmfarchcode2ôD cE # €€€‚ÿpvmfarchcode>1E ¡E ) "€*€€ã}E‰‚ÿsee pvm_archcode< cE ÝE 1nÀ‚YÝE F KF pvmfbarrier1¡E F # €€€‚ÿpvmfbarrier=ÝE KF ) "€(€€ã• ÿsee pvm_barrier: F …F 1lä$‚Z…F ´F ïF pvmfbcast/ KF ´F # €€€‚ÿpvmfbcast;…F ïF ) "€$€€ãßäóó‰‚ÿsee pvm_bcast< ´F +G 1n‚F‚[+G \G ™G pvmfbufinfo1ïF \G # €€€‚ÿpvmfbufinfo=+G ™G ) "€(€€ãÿ­A›‰‚ÿsee pvm_bufinfo= \G ÖG 1o$‚j‚\ÖG H FH pvmfcatchout2™G H # €€€‚ÿpvmfcatchout>ÖG FH ) "€*€€ã Štg‰‚ÿsee pvm_catchout; H H 1mF‚Š‚]H ±H íH pvmfconfig0 FH ±H # €€€‚ÿpvmfconfig<H íH ) "€&€€ãL<‰‚ÿsee pvm_config; ±H (I 1mj‚ª‚^(I XI ”I pvmfdelete0 íH XI # €€€‚ÿpvmfdelete<(I ”I ) "€&€€ã•ó ‰‚ÿsee pvm_delete= XI ÑI 1oŠ‚΂_ÑI J AJ pvmfdelhosts2”I J # €€€‚ÿpvmfdelhosts>ÑI AJ ) "€*€€ã®×0O‰‚ÿsee pvm_delhosts< J }J 1nª‚ð‚`}J ®J ëJ pvmfdelinfo1AJ ®J # €€€‚ÿpvmfdelinfo=}J ëJ ) "€(€€ãG£Ø‰‚ÿsee pvm_delinfo; ®J &K 1m΂ƒa&K VK ’K pvmfdelmhf0 ëJ VK # €€€‚ÿpvmfdelmhf<&K ’K ) "€&€€ãZIó ‰‚ÿsee pvm_delmhf9VK ËK 1kð‚,ƒbËK ùK 3L pvmfexit. ’K ùK # €€€‚ÿpvmfexit:ËK 3L ) "€"€€ãpu#‰‚ÿsee pvm_exit; ùK nL 1mƒLƒcnL žL ÚL pvmfexport0 3L žL # €€€‚ÿpvmfexport<nL ÚL ) "€&€€㲊š‰‚ÿsee pvm_export< žL M 1n,ƒnƒdM GM „M pvmffreebuf1ÚL GM # €€€‚ÿpvmffreebuf=M „M ) "€(€€ãE3àc‰‚ÿsee pvm_freebuf@GM ÄM 1rLƒ˜ƒeÄM ùM :N pvmffreecontext5„M ùM # €$€€‚ÿpvmffreecontextAÄM :N ) "€0€€ãy·s†‰‚ÿsee pvm_freecontext@ùM zN 1rnƒƒfzN ¯N ðN pvmffreezegroup5:N ¯N # €$€€‚ÿpvmffreezegroupAzN ðN ) "€0€€ãR£d‰‚ÿsee pvm_freezegroup; ¯N +O 1m˜ƒâƒg+O [O —O pvmfgather0 ðN [O # €€€‚ÿpvmfgather<+O —O ) "€&€€ãͱu%‰‚ÿsee pvm_gather?[O ÖO 1qƒhÖO € V€ pvmfgetcontext4—O € # €"€€‚ÿpvmfgeÖO € —O tcontext@ÖO V€ ) "€.€€ãóe[ʉ‚ÿsee pvm_getcontext; € ‘€ 1mâƒ7i‘€ Á€ ý€ pvmfgetfds0 V€ Á€ # €€€‚ÿpvmfgetfds<‘€ ý€ ) "€&€€ãõMF&‰‚ÿsee pvm_getfds< Á€ 9 1oZj9 j ¨ pvmfgetinst1ý€ j # €€€‚ÿpvmfgetinst>9 ¨ ) "€*€€ã>Óm‰‚ÿsee pvm_getinst@j è 1r7„kè ‚ ^‚ pvmfgetmboxinfo5¨ ‚ # €$€€‚ÿpvmfgetmboxinfoAè ^‚ ) "€0€€ã0‰Jʼn‚ÿsee pvm_getmboxinfo< ‚ š‚ 1nZ¦lš‚ Ë‚ ƒ pvmfgetmwid1^‚ Ë‚ # €€€‚ÿpvmfgetmwid=š‚ ƒ ) "€(€€ãÍØm‰‚ÿsee pvm_getmwid; Ë‚ Cƒ 1m„ÆmCƒ sƒ ¯ƒ pvmfgetopt0 ƒ sƒ # €€€‚ÿpvmfgetopt<Cƒ ¯ƒ ) "€&€€ãûF&‰‚ÿsee pvm_getopt< sƒ ëƒ 1n¦ènëƒ „ Y„ pvmfgetrbuf1¯ƒ „ # €€€‚ÿpvmfgetrbuf=ëƒ Y„ ) "€(€€ã™Ým‰‚ÿsee pvm_getrbuf< „ •„ 1nÆ o•„ Æ„ … pvmfgetsbuf1Y„ Æ„ # €€€‚ÿpvmfgetsbuf=•„ … ) "€(€€ã˜ÏÞm‰‚ÿsee pvm_getsbuf; Æ„ >… 1mè*p>… n… ª… pvmfgettid0 … n… # €€€‚ÿpvmfgettid<>… ª… ) "€&€€ãÛ³F&‰‚ÿsee pvm_gettid= n… ç… 1o Nqç… † W† pvmfgettmask2ª… † # €€€‚ÿpvmfgettmask>ç… W† ) "€*€€ã`Ó­t‰‚ÿsee pvm_gettmask: † ‘† 1l*lr‘† À† û† pvmfgsize/ W† À† # €€€‚ÿpvmfgsize;‘† û† ) "€$€€ãj^ õ‰‚ÿsee pvm_gsize9À† 4‡ 1kNˆs4‡ b‡ œ‡ pvmfhalt. û† b‡ # €€€‚ÿpvmfhalt:4‡ œ‡ ) "€"€€ã‹x#‰‚ÿsee pvm_halt= b‡ Ù‡ 1ol¬tÙ‡ ˆ Iˆ pvmfhostsync2œ‡ ˆ # €€€‚ÿpvmfhostsync>Ù‡ Iˆ ) "€*€€ãMélm‰‚ÿsee pvm_hostsync= ˆ †ˆ 1oˆÐu†ˆ ¸ˆ öˆ pvmfinitsend2Iˆ ¸ˆ # €€€‚ÿpvmfinitsend>†ˆ öˆ ) "€*€€ãÆ$«æ‰‚ÿsee pvm_initsend; ¸ˆ 1‰ 1m¬ðv1‰ a‰ ‰ pvmfinsert0 öˆ a‰ # €€€‚ÿpvmfinsert<1‰ ‰ ) "€&€€ã3ê 9‰‚ÿsee pvm_insert> a‰ Û‰ 1pÐwÛ‰ Š QŠ pvmfjoingroup7‰ Š & €"€€€‚ÿpvmfjoingroup?Û‰ QŠ ) "€,€€ãC^w0‰‚ÿsee pvm_joingroup9Š ŠŠ 1kð3xŠŠ ¸Š òŠ pvmfkill. QŠ ¸Š # €€€‚ÿpvmfkill:ŠŠ òŠ ) "€"€€ãî{#‰‚ÿsee pvm_kill; ¸Š -‹ 1mSy-‹ ]‹ ™‹ pvmflookup0 òŠ ]‹ # €€€‚ÿpvmflookup<-‹ ™‹ ) "€&€€ãœéT‰‚ÿsee pvm_lookup< ]‹ Õ‹ 1n3uzÕ‹ Œ CŒ pvmflvgroup1™‹ Œ # €€€‚ÿpvmflvgroup=Õ‹ CŒ ) "€(€€ãom\‰‚ÿsee pvm_lvgroup: Œ }Œ 1lS“{}Œ ¬Œ çŒ pvmfmcast/ CŒ ¬Œ # €€€‚ÿpvmfmcast;}Œ çŒ ) "€$€€ãzº1ö‰‚ÿsee pvm_mcast: ¬Œ ! 1lu±|! P ‹ pvmfmkbuf/ çŒ P # €€€‚ÿpvmfmkbuf;! ‹ ) "€$€€ã“v;ö‰‚ÿsee pvm_mkbuf: P Å 1l“Ï}Å ô /Ž pvmfmstat/ ‹ ô # €€€‚ÿpvmfmstat;Å /Ž ) "€$€€ãß©Eö‰‚ÿsee pvm_mstat: ô iŽ 1l±í~iŽ ˜Ž ÓŽ pvmfmytid/ /Ž ˜Ž # €€€‚ÿpvmfmytid;iŽ ÓŽ ) "€$€€ã™òLö‰‚ÿsee pvm_mytid?˜Ž  1qÏ F † pvmfnewcontext4ÓŽ F # €"€€‚ÿpvmfnewcontext@ † ) "€.€€ãéZb‰‚ÿsee pvm_newcontext; F Á 1m퀀Á À HÀ pvmfnotify0 † À # €€€‚ÿpvmfnotifyÁ À † <Á HÀ ) "€&€€ãA¦e‰‚ÿsee pvm_notify: À ‚À 1l1€‚À ±À ìÀ pvmfnrecv/ HÀ ±À # €€€‚ÿpvmfnrecv;‚À ìÀ ) "€$€€ãþ1xö‰‚ÿsee pvm_nrecv; ±À 'Á 1m€Q€‚'Á WÁ “Á pvmfparent0 ìÀ WÁ # €€€‚ÿpvmfparent<'Á “Á ) "€&€€ãºOt‰‚ÿsee pvm_parent; WÁ ÎÁ 1m1€q€ƒÎÁ þÁ : pvmfperror0 “Á þÁ # €€€‚ÿpvmfperror<ÎÁ : ) "€&€€ãæÂ u‰‚ÿsee pvm_perror: þÁ t 1lQ€€„t £Â Þ pvmfprecv/ : £Â # €€€‚ÿpvmfprecv;t Þ ) "€$€€ã`‡àö‰‚ÿsee pvm_precv: £Â à 1lq€­€…à Gà ‚à pvmfprobe/ Þ Gà # €€€‚ÿpvmfprobe;à ‚à ) "€$€€ã^Ïàö‰‚ÿsee pvm_probe: Gà ¼Ã 1l€Ë€†¼Ã ëà &Ä pvmfpsend/ ‚à ëà # €€€‚ÿpvmfpsend;¼Ã &Ä ) "€$€€㺿áö‰‚ÿsee pvm_psend: ëà `Ä 1l­€é€‡`Ä Ä ÊÄ pvmfpstat/ &Ä Ä # €€€‚ÿpvmfpstat;`Ä ÊÄ ) "€$€€ãò)âö‰‚ÿsee pvm_pstat< Ä Å 1nË€ ˆÅ 7Å tÅ pvmfputinfo1ÊÄ 7Å # €€€‚ÿpvmfputinfo=Å tÅ ) "€(€€ãkÙ9‰‚ÿsee pvm_putinfo97Å ­Å 1ké€'‰­Å ÛÅ Æ pvmfrecv. tÅ ÛÅ # €€€‚ÿpvmfrecv:­Å Æ ) "€"€€ã¬M„#‰‚ÿsee pvm_recv: ÛÅ OÆ 1l EŠOÆ ~Æ ¹Æ pvmfrecvf/ Æ ~Æ # €€€‚ÿpvmfrecvf;OÆ ¹Æ ) "€$€€ãú 9÷‰‚ÿsee pvm_recvf= ~Æ öÆ 1o'i‹öÆ (Ç fÇ pvmfrecvinfo2¹Æ (Ç # €€€‚ÿpvmfrecvinfo>öÆ fÇ ) "€*€€ãÆG ‰‚ÿsee pvm_recvinfo; (Ç ¡Ç 1mE‰Œ¡Ç ÑÇ È pvmfreduce0 fÇ ÑÇ # €€€‚ÿpvmfreduce<¡Ç È ) "€&€€ãì1–†‰‚ÿsee pvm_reduce> ÑÇ KÈ 1qi°KÈ ~È ¾È pvmfreghoster3 È ~È # € €€‚ÿpvmfreghoster@KÈ ¾È ) "€.€€㔂*މ‚ÿsee pvm_reg_hoster: ~È øÈ 1m‰ÏŽøÈ 'É cÉ pvmfregrm/ ¾È 'É # €€€‚ÿpvmfregrm<øÈ cÉ ) "€&€€ãÚ*™†‰‚ÿsee pvm_reg_rm> 'É ¡É 1q°ö¡É ÔÉ Ê pvmfregtasker3cÉ ÔÉ # € €€‚ÿpvmfregtasker@¡É Ê ) "€.€€ã©øuô‰‚ÿsee pvm_reg_tasker< ÔÉ PÊ 1nÏ‚PÊ Ê ¾Ê pvmfscatter1Ê Ê # €€€‚ÿpvmfscatter=PÊ ¾Ê ) "€(€€ãÜ'߉‚ÿsee pvm_scatter9Ê ÷Ê 1kö4‚‘÷Ê %Ë _Ë pvmfsend. ¾Ê %Ë # €€€‚ÿpvmfsend:÷Ê _Ë ) "€"€€ã†…#‰‚ÿsee pvm_send< %Ë ›Ë 1n‚V‚’›Ë ÌË Ì pvmfsendsig1_Ë ÌË # €€€‚ÿpvmfsendsig=›Ë Ì ) "€(€€ã‡:ø‰‚ÿsee pvm_sendsig; ÌË DÌ 1m4‚v‚“DÌ tÌ °Ì pvmfserror0 Ì tÌ # €€€‚ÿpvmfserror<DÌ °Ì ) "€&€€ãFj‰‚ÿsee pvm_serror?tÌ ïÌ 1qV‚ž‚”ïÌ #Í cÍ pvmfsetcontext4°Ì #Í # €"€€‚ÿpvmfsetcontext@ïÌ cÍ ) "€.€€ãwa’S‰‚ÿsee pvm_setcontext< #Í ŸÍ 1nv‚À‚•ŸÍ ÐÍ Î pvmfsetmwid1cÍ ÐÍ # €€€‚ÿpvmfsetmwid=ŸÍ Î ) "€(€€ã¹B<‰‚ÿsee pvm_setmwid; ÐÍ HÎ 1mž‚à‚–HÎ xÎ ´Î pvmfsetopt0 Î xÎ # €€€‚ÿpvmfsetopt<HÎ ´Î ) "€&€€ã¿l‰‚ÿsee pvm_setopt< xÎ ðÎ 1nÀ‚ƒ—ðÎ !Ï ^Ï pvmfsetrbuf1´Î !Ï # €€€‚ÿpvmfsetrbuf=ðÎ ^Ï ) "€(€€ãñ½A‰‚ÿsee pvm_setrbuf< !Ï šÏ 1nà‚˜šÏ ËÏ pvmfsetsbuf1^Ï ËÏ # €€€‚ÿpvmfsetsbuf=šÏ ) "€(€€ã„ôB‰‚ÿsee pvm_seËÏ ^Ï tsbuf= ËÏ Q1oƒ$™QƒÁpvmfsettmask2ƒ# €€€‚ÿpvmfsettmask>QÁ) "€*€€ã€è‰‚ÿsee pvm_settmask= ƒþ1oHšþ0npvmfsiblings2Á0# €€€‚ÿpvmfsiblings>þn) "€*€€ã—B,‰‚ÿsee pvm_siblings: 0¨1l$f›¨×pvmfspawn/ n×# €€€‚ÿpvmfspawn;¨) "€$€€ã½€z÷‰‚ÿsee pvm_spawn> ×P1qHœPƒÃpvmfstartpvmd3ƒ# € €€‚ÿpvmfstartpvmd@PÃ) "€.€€ã®c¤©‰‚ÿsee pvm_start_pvmd: ƒý1lf«ý,gpvmftasks/ Ã,# €€€‚ÿpvmftasks;ýg) "€$€€ãÔøœ÷‰‚ÿsee pvm_tasks> ,¥1pÑž¥Øpvmftidtohost3gØ# € €€‚ÿpvmftidtohost?¥) "€,€€ãT‰‚ÿsee pvm_tidtohost: ØQ1l«ïŸQ€»pvmftrecv/ €# €€€‚ÿpvmftrecv;Q») "€$€€ã$2±÷‰‚ÿsee pvm_trecv= €ø1oÑ ø*hpvmfunexport2»*# €€€‚ÿpvmfunexport>øh) "€*€€ãù=8‰‚ÿsee pvm_unexport: *¢1iïÿÿÿÿ¡¢ÿÿÿÿÑpvmfunpk*/ hÑ# €€€‚ÿpvmfunpk*9¢ 1g€€5„¢ ÿÿÿÿ8Glossary. Ñ8# €€€‚ÿGlossary@ x1e ÿÿÿÿ£x­ºBPVM Error Codes58­# €$€€‚ÿPVM Error CodesÁx¾P n€ƒ€€‚‚€€‚‚‚€€‚‚‚€€‚‚‚€€‚‚‚€€‚ÿPvmAlreadyThe requested operation requires exclusive access, and another was already in progress.PvmBadMsgThe received messages has a data format native to another machine, which cannot be decoded by libpvm.PvmBadParamA bad parameter was passed to the function.PvmBadVersionTwo PVM components (pvmd and task, two pvmds or two tasks) have incompatible protocol versions and cannot interoperate. Version mismatchPvmCantStart„<­B H ^€y€€‚‚€€‚‚‚€€‚‚‚€€‚‚‚€€‚‚ÿA pvmd could not be started on the local host, or a slave pvmd could not be started on a remote host.PvmDSysErrSome internal mechanism in the pvmd failed during the requested operation. PvmDupEntryThe class server already has an entry matching the insert request. [In Version 3.4: Relaced by PvmExists]PvmDupGroupThe task has already a member of the group it attempted to join.PvmDupHostAn attempt was made to add the same host to a virtual machine more than once, or to add a host already a member of another virtual machine owned by the same user.º¾U Y €€u€€‚€€‚‚‚€€‚‚‚€€‚‚‚€€‚‚‚€€‚‚‚€€‚‚ÿPvmDeniedOperation is refused due to locking, permissions, etc.PvmExistsThere is already an entry matching the insert request.PvmHostFailA foreign host in the virtual machine failed during the requested operation. PvmMismatchA parameter does not match a corresponding one.PvmNoBufThere is no current message buffer to pack or unpack.PvmNoDataThe end of a message buffer was reached while trying to unpack data.ÂB pY €€…€€‚€€‚‚‚€€‚‚‚€€‚‚‚€€‚‚‚€€‚‚‚€€‚‚ÿPvmNoEntryThe class server has no entry matching the lookup request. [In Version 3.4: Relaced by PvmNotFound]PvmNoFileThe named executable does not exist.PvmNoGroupThe named group does not exist.PvmNoHostThere is no host in the virtual machine with the given name, or the name could not be resolved to an address.PvmNoInstThe named group has no member with this instance.PvmNoMemMalloc failed to get memory for libpvm.ŸU ~Ac ”€?€€‚€€‚‚‚€€‚‚‚€€‚‚‚€€‚‚‚€€‚‚‚€€‚‚‚€€‚‚‚ÿPvmNoParentThis task has no parent task.p~A8PvmNoSuchBufThere is no message buffer with the given buffer handle.PvmNoTaskNo task exists with the given tid.PvmNotFoundNo entry matching the lookup request was found.PvmNotImplThis libpvm function or option is not implemented.PvmNotInGroupThe named group has no such member task.PvmNullGroupA null group name was passed to a function.<pºB< F€€€€‚‚‚€€‚‚‚€€‚‚‚‚ÿPvmOutOfResThe requested operation could not be completed due to lack of resources.PvmOverflowA value is too large to be packed or unpacked.PvmSysErrLibpvm could not contact a pvmd on the local host, or the pvmd failed during an operation.B~AüB1Ç*ÿÿÿÿ¤üB3CÉFList of PVM Calls7ºB3C# €(€€‚ÿList of PVM Calls>üBqE= H€€€€‚‚‚‚€€‚‚‚‚€€‚‚‚ÿMessage Passingpvm_bufinfo, pvm_freebuf, pvm_getrbuf, pvm_getsbuf, pvm_initsend, pvm_mcast, pvm_mkbuf, pvm_nrecv, pvm_pack, pvm_precv, pvm_probe, pvm_psend, pvm_recv, pvm_recvf, pvm_send, pvm_sendsig, pvm_setmwid, pvm_setrbuf, pvm_setsbuf, pvm_trecv, pvm_unpackTask Controlpvm_exit, pvm_kill, pvm_mytid, pvm_parent, pvm_pstat, pvm_spawn, pvm_tasks Group Library Functionspvm_barrier, pvm_bcast, pvm_gather, pvm_getinst, pvm_gettid, pvm_gsize, pvm_joingroup, pvm_lvgroup, pvm_reduce, pvm_scatterX 3CÉF8 >€A€€‚€€‚‚‚‚€€‚‚‚‚ÿVirtual Machine Controlpvm_addhosts, pvm_config, pvm_delhosts, pvm_halt, pvm_mstat, pvm_reg_hoster, pvm_reg_rm, pvm_reg_tasker, pvm_start_pvmd Miscellaneouspvm_archcode, pvm_catchout, pvm_getopt, pvm_hostsync, pvm_notify, pvm_perror, pvm_setopt, pvm_settmask, pvm_tidtohostMqEG1ÿÿÿÿ¥GÿÿÿÿYGPVM in the WIN32 environmentC ÉFYG# €@€€‚ÿPVM in the WIN32 environment = G–G1‰ÿÿÿÿp‡¦–GÈG KInstallation2YGÈG# €€€‚ÿInstallation¬…–GtJ' € €€‚‚‚‚ÿPVM now comes with a self extracting executable which guides you through the installation. The wizzard asks for destination paths and directories for temporary data. Furthermore you can distinguish between a typical, a custom or administrative installation. The latter one is meant for configuring the daemon which is required for startup of other WIN32 hosts to your machine.Unlike earlier versions PVM uses the registry to store relevant information. Based on the installation and chosen compiler, a generic Makefile lets you recompile PVM on a dos-prompt bases. It is also possible to use the script for compiling your own applications.¬‡ÈG K% €€€‚‚ÿAn uninstall is simply done by choosing SYSTEM CONTROL, SOFTWARE and clicking on add/remove after highlighting the PVM 3.4 package.HtJhK1ØU„s§hK¥K ƒDifferences to UNIX PVM= K¥K# €4€€‚ÿDifferences to UNIX PVMçhKµM) €Ï€€‚‚‚‚‚‚ÿThere are differences in the implementation to the UNIX version, as well as differences between 9x and NT. PVM is switching during runtime to the correct WIN32 mode.The user on a WIN32 sees the difference in the pvm{l,d}. file instead of pvmd. used on UNIX hosts. This requires a WIN32 user to be logged onto the system ! If you see a pvm{l,d}.SYSTEM file your properties are not set up correctly.The more important changes are when starting up another WIN32 host.&¥KÛM# €€€‚ÿãµM €3 4€Ç€€ €ƒ€€‚‚‚‚‚‚ÿ·Before adding any WIN32 host make sure you installed a rshd or rexecd. In the pvm-shell (pvm.exe) you have to use the add command. Adding WIN32 hosts requires you to specify the location of the pvm daemon (including executable). A proper add command for a WIN32 box (using the same account, rsh-ing in) looks like: add "hostname dx=c:\pvm\pvm3\lib\win32\pvmd3.exe" for adding a NT box with a different login (using rexecd) you have to type: ÛM € K¬„ÛM¸€( € €€‚‚‚‚‚ÿ add "hostname dx=c:\pvm\pvm3\lib\win32\pvmd3.exe lo=yourlogin so=pw" so=pw is a fixed expression !Y. €+ &€\€dCPÈ:‚H€ €ƒ‚ÿ·Adding Unix machines is simply done by: øÁ¸€ ƒ7 <€ƒ€€‚‚‚‚‚ƒ‚ƒ‚‚‚‚‚‚ƒ‚‚‚‚‚ÿ add hostname Before you try to add other hosts you should check whether your rshd settings are correct. This is simply done by getting the content of the remote directory. Tryrsh remotehost -l yourlogin dir | moreIf this works you are ready to run PVM on your machines.If you like to fire up PVM with a hostfile, you have to provide the full path to the file:eg. pvm c:\users\markus\hostfile.txtN-Joy.4=ƒ1„ p‡ÿÿÿÿ¨=ƒfƒ¹FAQ) ƒfƒ# € €€‚ÿFAQ4=ƒš…- (€€€‚‚‚‚‚‚‚‚‚‚ÿ Frequently Asked Questions for Setting up PVM for WIN32 Installation For PC based systems running '95 or NT we now created an InstallShield which leads you through the installation. Environment variables are no longer used and PVM Keys are stored in the registry. Additional Software You are still required to install a rshd on WIN95-boxes, if you like to add them to your Virtual Machine. On WIN NT you can choose between rexecd or rshd. For simpleDfƒÞ‡* "€5€€‚‚‚‚‚‚‚ÿ testing you can try your permissions and proper installations in the MS-DOS prompt by getting the directory of the remote machine, rsh remotehost dir , for example. If this does not work you do not have a PVM problem and should contact your SysAdmin. However we are also working on distributing a rshd. This is currently working under "laboratory conditions". What Filesystems do I need ? When running NT you are required to use NTFS (security), with WIN95 you can use-š… Š, &€€€‚‚‚‚‚‚‚‚‚ÿ FAT32 or FAT. How do I add hosts to my machine ? Before adding any WIN32 host make sure you installed the additional software . In the pvm-shell (pvm.exe) you have to use the add command. Then, adding WIN32 hosts requires you to specify the location of the daemon (including executable) A proper add command for a WIN32 box (using the same account, rsh-ing in) looks like: add "hostname dx=c:\pvm\pvm3\lib\win32\pvmd3.exe" S Þ‡^Œ3 4€A€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ÿ for adding a NT box with a different login (using rexecd) you have to type: add "hostname dx=c:\pvm\pvm3\lib\win32\pvmd3.exe lo=login so=pw" Adding Unix machines is simply done by: add hostname I can't establish rexec or rsh on my WIN machines ! On WIN NT you are required to be allowed to log on as a service. You'll find this in the user rights entries. You need to have administrative rights to perform the changes,T' вŽ- (€O€€‚‚‚‚‚‚‚‚‚‚ÿ though. You do not need any administrative rights to run PVM ! Where do I get proper rsh or rexec daemons for WIN32 ? There are several rexecd or rshd out there. But some or most of them do not follow the BSD specifications. We have good experiences with http://www.ataman.com. How do I set the environments properly ? Environment variables are no longer needed :-) What is a service pack ? Service packs are provided by MS ... for NT 3.51 you'll need service pack 5 or laterà^Œ¹' €Á€€‚‚‚‚ÿ for WIN95 service pack 1 ! What is a rshd or rexecd ... ? These daemons (rshd XOR rexecd) are required to fire up PVM. You need to install them on each machine you like to run PVM on. 1²Ž À1Uÿÿÿÿÿÿÿÿ©ÿÿÿÿ À0À¹ À¹$¹0À" €€€ ÿ1 Àÿÿÿÿ1ÿÿÿÿÿÿÿÿªÿÿÿÿÿÿÿÿÿÿÿÿêá hMS Sans SerifSystemFixedsysTerminalMS SerifCourierSymbolSmall FontsModernMarlettArial ) sU„z‰æ€€€€/&;)F24ÿÿCÿÿÿÿFAQInstallationIntroductionlibpvm3, libfpvm3 library pvm consolePVM Fortran InterfacePVM Message Passing Functionspvmd3 daemon/&;)Lzÿÿ«ÿÿIntroductionªPVM Introæpvm console€pvmd3 daemonz‰libpvm3, libfpvm3 library€PVM Message Passing Functions€ƒpvm_addhostshpvm_addmhf€pvm_adviseë†pvm_archcodeÛ‹pvm_barrier–pvm_bcast€pvm_bufinfo{†pvm_catchoutÐpvm_config× pvm_deleteð pvm_delhostsš…pvm_delinfow„pvm_delmhf—„pvm_exit‰‡pvm_exportÄ‹pvm_freebufÄpvm_freecontextípvm_freezegroup‚pvm_gatheræ pvm_getcontext pvm_getfds– pvm_getinstÉ„ pvm_getmboxinfoï„ pvm_getmwid… pvm_getoptìŠ pvm_getrbufy pvm_getsbuf¹ pvm_gettidÉ pvm_gettmaskí pvm_gsizeÜ pvm_halt”€ pvm_hostsyncq† pvm_initsendp pvm_insert{ pvm_joingroupP pvm_killq… pvm_lookupóˆ pvm_lvgroup^ pvm_mcast pvm_mkbuf°‡ pvm_mstat pvm_mytid« pvm_newcontextn pvm_notifyXŠ pvm_nrecvþpvm_pk*“pvm_parent‘pvm_perrorB pvm_precvWpvm_probeˆpvm_psend݇pvm_pstatŸŠpvm_putinfoÁˆpvm_recvLpvm_recvf€pvm_recvinfo#€pvm_reduce‰pvm_reg_hoster[†pvm_reg_rmŠpvm_reg_taskerÄ pvm_scatter‰pvm_sendÇpvm_sendsig±pvm_serror€pvm_setcontext(€pvm_setmwidÁ„pvm_setopt ‚pvm_setrbuf°‡pvm_setsbufpvm_settmaskê pvm_siblingso†pvm_spawn€pvm_start_pvmdn†pvm_tasks pvm_tidtohostkpvm_trecv-…pvm_unexportO…pvm_unpk*€€PVM Fortran Interface\pvmfaddhosts€pvmfaddmhf pvmfadviseÀpvmfarchcodeäpvmfbarrier‚pvmfbcast$‚pvmfbufinfoF‚pvmfcatchoutj‚pvmfconfigŠ‚pvmfdeleteª‚pvmfdelhosts΂pvmfdelinfoð‚pvmfdelmhfƒpvmfexit,ƒpvmfexportLƒpvmffreebufnƒpvmffreecontext˜ƒpvmffreezegroupƒpvmfgatherâƒpvmfgetcontextpvmfgetfds7pvmfgetinstZpvmfgetmboxinfo„pvmfgetmwid¦pvmfgetoptÆpvmfgetrbufèpvmfgetsbuf pvmfgettid*pvmfgettmaskNpvmfgsizelpvmfhaltˆpvmfhostsync¬pvmfinitsendÐpvmfinsertðpvmfjoingrouppvmfkill3pvmflookupSpvmflvgroupupvmfmcast“pvmfmkbuf±pvmfmstatÏpvmfmytidA,ÿÿípvmfnewcontextpvmfnotify€pvmfnrecv1€pvmfparentQ€pvmfperrorq€pvmfprecv€pvmfprobe­€pvmfpsendË€pvmfpstaté€pvmfputinfo pvmfrecv'pvmfrecvfEpvmfrecvinfoipvmfreduce‰pvmfreghoster°pvmfregrmÏpvmfregtaskeröpvmfscatter‚pvmfsend4‚pvmfsendsigV‚pvmfserrorv‚pvmfsetcontextž‚pvmfsetmwidÀ‚pvmfsetoptà‚pvmfsetrbufƒpvmfsetsbufpvmfsettmask$pvmfsiblingsHpvmfspawnfpvmfstartpvmdpvmftasks«pvmftidtohostÑpvmftrecvïpvmfunexportpvmfunpk*Glossary*PVM Error CodesList of PVM Calls5„PVM in the WIN32 environmentU„Installationp‡Differences to UNIX PVMsFAQ €pvm_killq… pvm_lookupóˆ pvm_lvgroup^ pvm_mcast pvm_mkbuf°‡ pvm_mstat pvm_mytid« pvm_newcontextn pvm_notifyXŠ pvm_nrecvþpvm_pk*“pvm_parent‘pvm_perrorB pvm_precvWpvm_probeˆpvm_psend݇pvm_pstatŸŠpvm_putinfoÁˆpvm_recvLpvm_recvf€pvm_recvinfo#€pvm_reduce‰pvm_reg_hoster[†pvm_reg_rmŠpvm_reg_taskerÄ pvm_scatter‰pvm_sendÇpvm_sendsig±pvm_serror€pvm_setcontext(€pvm_setmwidÁ„pvm_setopt ‚pvm_setrbuf°‡pvm_setsbufpvm_settmaskê pvm_siblingso†pvm_spawn€pvm_start_pvmdn†pvm_tasks pvm_tidtohostkpvm_trecv-…pvm_unexportO…pvm_unpk*€€PVM Fortran Interface\pvmfaddhosts€pvmfaddmhf pvmfadviseÀpvmfarchcodeäpvmfbarrier‚pvmfbcast$‚pvmfbufinfoF‚pvmfcatchoutj‚pvmfconfigŠ‚pvmfdeleteª‚pvmfdelhosts΂pvmfdelinfoð‚pvmfdelmhfƒpvmfexit,ƒpvmfexportLƒpvmffreebufnƒpvmffreecontext˜ƒpvmffreezegroupƒpvmfgatherâƒpvmfgetcontextpvmfgetfds7pvmfgetinstZpvmfgetmboxinfo„pvmfgetmwid¦pvmfgetoptÆpvmfgetrbufèpvmfgetsbuf pvmfgettid*pvmfgettmaskNpvmfgsizelpvmfhaltˆpvmfhostsync¬pvmfinitsendÐpvmfinsertðpvmfjoingrouppvmfkill3pvmflookupSpvmflvgroupupvmfmcast“pvmfmkbuf±pvmfmstatÏpvmfmytidôí/&;)L4ÿÿ©°©ÿÿÿÿƒ}ƒ$P±\…äy·s†Äì1–†#€Ú*™†[†”‚*މFj±¿lÁ„èúxïвđ€€˜û‘˜ƒM%“3œ£½•J¶˜Î‚—μ˜ö‚¡™ÿ­A›€j‘¸œÀ´\±¤Ùk¦ª‚®c¤©€BáÕ¬4‚«÷­«t鮞‚¬d®à‚?› ®ƒ„”Z³€ƒÅÕZ³1€—Þ+´Q€v‹¯¾F‚¶ê§Äˆ0‰JÅÉ„ M¡Åióe[Êæ æƒÊ‰ÉÔèË*ÈauÎV‚p¹wÎÀ‚&€îÏé€b@rÑU„T•ˆÓâƒæš`×ð}$áæÆ$«æq† €è¹é€ºQÖê• îÛ‹àækñh*¢ñ€*õòSßäóó–©øuôŠj^ õí ñnõªzº1ö^ “v;ö ß©Eö°‡ ™òLö ›®tö€þ1xöXŠ `‡àö€^ÏàöWº¿áöˆò)âö݇ú 9÷L½€z÷o†Ôøœ÷n†$2±÷k;Óà÷O…Ú½úLƒ$·Kþfâ¡sG£Øš…Ü'ßÄ ‘5áp‡ùª°7ˆÄµ„À?»ÆSv¼èL<ÐT R£díÆG €í•• \•ó × ZIó w„Ĭ nƒ‡:øÇ¹B<(€ñ½A ‚„ôB°‡²Šš‰‡pu#—„‹x#Ü î{#P ¬M„#Áˆ†…#‰©’J%ƒÄM%l=nQ%åÍY% ?[%‚ͱu%‚õMF& ûF&… Û³F&¹ —B,ê  Ùµ-z‰‘w0€C^w0{ Û½Œ0 ûùÚ0ϺT2$‚ù=8-…kÙ9ŸŠ3ê 9p /&æ=¬m»?rnÐB‚ýçèCNýGDj‚ DEu&E“r3"E±,|)EÏ‘»TE€}Eë†ó½Eq€ñX½E€MI¾E­€…³¾EË€•F'̱F°P WFHg‚yF·»FÑÎ\½FF-þJŠ‚ eþJð‚f¹ÿN5„®×0Oð {~áOZwa’S€œéTq… c¦¥W,ƒGB³W*om\óˆ Ø¿\v‚/‚aEéZb« E3àc~Í€dƒ¦iQe¬¬Qe¦ŒÏQe A¦en Štg{†JŠ2kíýkþMélm”€ >Óm– ÍØmï„ ™ÝmìŠ ˜ÏÞmy ºOt“`Ó­tÉ æÂ u‘ä¬xÐí ä lpp ˆ3ŽŽ â œ …‚ ‡ Ù Ä %…÷€ÿ„ÿ€1…4‹5œ C ̃]‚„Ù Ä (‚]ƒ‚´ €ÿƒ€ÿ2AAAAAAAA&‚Š &… &‚… &‚… & & & & & …ƒ "‚ ‹‚ " '"$""#"‚ ""…""  "!ƒ „"  " ƒ33„" "‚ 3…" "‚  3… ""‚ ƒ 3"ƒ"‚ ‚  30" "‚ ‡" "  3"3ƒ0" ˆ""   3…"" 3ƒ0"‚"„  3†" 30„330"Œ"" "   3‚0 … 3"…330""" "" "  30ƒ 0"3‚" """""  30ƒ" "3‚0"Œ "" 3""  30ƒ""" 3‚" " " 30""  30„"" "3‘0" " " "00""  30„" "‚ 3" ""00""  3‚0 „"" "‚" 3" " 300""  3‚0 ‹"" 30"3‘0"" " 3030""  3‚0"‚""3‚0"‚ 3’0" " "330"" "  3Š0" "" 3‚0" 3’0" ""330"" ""  30"‚ 30"30" " 3330"" " 3"‚  3"† 33" Š" 30330"" " 30 3–"" 33" "30330"" "3‰0"" 3"Š"3330"" " 3‚03•0"" "" 33330"" "3†"3Œ0"" " 303„0"" "3" 3‰0" "303„0"" "30"3‚0"ƒ33„0"" "3" 3† 333„0"" "30 "3ƒ303„0"" "3 "303„0"" "3ƒ0"ƒ 303…" "3‚ "ƒ"303‚""30‚ "3030"" 30"3030"" 3"303„"" "ƒ30"„ "303„"" "„330"„ "3„0330"" ‚0"„"3‡0330"" " ‚0 †"3‡033"" "‚ ƒ33‚ ‚3‡033"""‚ ‚3 …" 3ƒ030"…"" ‚0 „" 3Š30"" "" „330 ƒ"3‰3"""" ‚0 ƒ" 3ˆ3""" ‚3 ‚ 3‡0"" " ƒ33 ‚3‡00"" 3 3†0"" „330 3†" „3303†"" 33„3‚333 3#30&3„0) 3„0, 3„0/3„023„05†308ƒ;AAAAAAAƒ+z+lpÚ2ã )˶VŽ Êr¤p…‚  - 4÷á …ááÁœ›œœ••á—E*L#7à.à:ááp\…4‹5¤pC Ì„sì„- 4(…ìsƒ‚Ý ƒá …ááÁœœœ›á••*E—#L.à7:àpááMnnƒj…j…j…j…j…j…j…j…j…j‡    ‚                 ‚   !…  ‚      … „„‚„ƒ‚„ ‚„„‚„…  ‚ ƒ‚‚‚‚  …‚ ‚‚‚‚ …‚„‚ ƒ‚‚‚‚…ƒ ƒ ‚‚ ƒ‚ƒ„‚ ƒ ‚‚%…‚ ‚‚‚‚ ‚‚„‚ ‚ ‚‚‚&…  ‚ ‚ ‚  †…  ‚‚… † †‚‚ ‚  ‚††… † ‚‚‚… …‚„ …‚…† ‚‚‚…„„‚„ ‚„…† „ƒ„…‚ƒ‚… ‚ƒ‚ ‚ƒ…‚‚‚‚† ‚‚ ‚ƒ‚ ‚‚‚…‚‚‚„‚ ƒ„  ‚…‚ ‚‚‚ƒ ‚‚ ‚‚‚ ‚‚  …   ‚ ƒ  ‚  ƒ …‚A‚„ 4 2K…@‚‚‚31J…?‚ 1 ‚/H‡E   ‚6    4H…D   S  1H…   k  KI…j…j…j…j…j…j…j…j…j…* 8…# 2…   0…  -…C ) "  ,…<    +…:     "‚ *…8     %‚ )…6    ‚ (‚ (…5   . († &‚ # " 6‚  ˆ $    Š ‚#‚ ‚ ‚ Œ ‚"‚  ‚ Œj‚  ‚ ‚jŒj‚ ‚  ‚ ‚jŒj‚ ‚‚ ‚ ‚ ‚jŒj‚‚‚  ‚‚jŒ D‚‚‚ ‚ ‚‚D Œ ?‚‚ ‚ ‚‚? Œ ; †‚ ‚ † ; Œ‚ ‚9„‚  „9‚ ‚‚ƒ‚0„‚  ‚ „0‚ƒ …‚.„ %‚ ‚ „.‚„   ‚ ‚ ‚,„‚  '‚   „,‚ ‚ …  †† ‚*„‚   ƒ‚   ‚*‚ …†  ‚‚‚ ƒ ‚(„‚ !ƒ ‚(‚ ‚‚‚  ‚  ƒ ‰‚  "ƒ‚ „‰ ƒ  ‚‚  ‚„ „ ‚ ‰„ ‚ #‚+„‰ ‚„ ‚ ‚  ƒ ‚Œ‚‰… # +„‰‚‰‚ ‚†   ‚… ‚ ‡ ‚‰„ # +„‰‚‡   ƒ‚  ‚‚ ‚ ‡ ‚‰„(!  +„‰‚ †  †‚  ‚ ‹ „(! ‚ +„‹  ƒ‚  ‰‚ † ƒ‚Œ„(  „‚+„Œ ƒƒ … ‚‰ƒ  ƒ‚ ‚ Œ  …„(  ‚+„… ‚Œ  ‚ ‚ƒ   ‚„ ‰  ‚ “„( ƒƒ ‚‚+„“ ‚ˆ „ ‚    ‰ …  ‚”„(   ‚ ‚+„”‚ …‰     ‰  ”„(  ‚‚+„”ˆ    ‚ ƒ…  ”„(‚ „+„” … ‚    …  ˆ‰„(   ‚ ƒ+„‰ˆˆ  ‚    …  ”„(‚  ƒ ƒ+„” …        “„(  ƒ …+„“      ƒ‚'  Œ„( …ƒ +„Œ ' ‚ƒ  ‚ƒ' Œ„(  ‚ƒ+„Œ& ‚   '  ‹ „(   ‚ƒ +„ ‹&    ƒ'  Œ  „(     +„   & „  '  ‹  „(      +„  ‹ & ‚   '  ‚  „(   ‚   +„ ‘ ‚ & ‚  ‚(  ˆ‚ „'    ‚    ‚+„ ‚ ˆ ' ‚   ' ˆ ‚ „$   *„ ‚ ˆ'   ' „‚‰ ‚ …#    )… ‚ ‰‚„' „  ƒ' „‚ ‚ ƒ(   &ƒ ‚ ‚„( ƒ  ) „ ‚ ƒ'   &‚ ‚ „)   + ƒ‚ ‚ ‚M‚ ‚ ‚ƒ*   , ‚ ‚ ‚M‚ ‚ ‚,   ‚* ƒ‚ ‚ ‚‚M‚‚ ‚ ‚‚+ ‚ , +‚ ‚ ‚M‚ ‚ ‚* ,  9‚ ‚M‚ ‚9   H‚ ‚ ‚M‚ ‚ ‚G   W‚  ‚M‚  ‚V  e ‚M‚ e ‚M‚ Œ ‚M‚ Œ ‚M‚ Œ ‚M‚ Œ ‚M‚ Œ ‚M‚ Š M ˆ M …nnãÚ×ÍÆš‚]`®W â œ   Ù Ä %÷€€€ÿÿÿÿ€45œ C Ì]‚Ù Ä (‚]´€€€ÿÿÿ€ÿ""""""""""" """"""""""""""""""" """"""""" """""""""" """""""""""33" """""""""""" 3333333"""""""""""""" 33333333333 """"""""""""" 333333333333""""""""""""  333333333330"""" """"""" " " 33333333333""""3330"""""" ""  33333333333"" 333330"""""""" 33333333333" 30330""""""" " 33333333330  3"""330""""""" "" " 33333333330 0""""""333"""""" """"" 33333333330" """""""3330"""""" "" 3"" 33333333330"""""""""" 33333""" " " 30"" 33333333330"""""""""""333330" " " "00"" 33333333330" """"""""" 333333" ""00"" 33333333330 "" """""""" 3333333" " 300"" 33333333330 "" 30""""333330"" " 3030"" 33333333330"""33330""" 33330" " "330"" " 33333333330" "" 33333330""" 33330" ""330"" "" 33333333330""""""3333333330""""3330" " 3330"" """33333333333"""" 33333333333""" 33" " 30330"" """"3333333333303333333333333"" 33" "30330"" """""3333333333333333333333333333330"" 3""3330"" """""3333333330333333333333333333330"" "" 33330"" """""33333333"33333333333333333330"" " 303330"" """""3333333""""" 33333333333333333333330" "303330"" """""3333330"""""""33333333333333333333330"""33330"" """""333333""""""" 333333333333333333333333 333330"" """""333330"""""""""33333333333333333333333333033330"" """""33333"""""""""333333333333333333333333333033330"" """""33330"""""" 33333333333333333333333333303333" "3333 """""33333333333333333333333333303333"""""3330 """"""33333333333333333333333333303330""""""" 3330"""""""33333333333333333333333333303330""""""" 333"""""""3333333333333333333333333330333"" """""30"""" "3333333333333333333333333330333"" """""330"""" "3333333333333333333333333330330""""""" 0""""3333333333333333333333333330330"" """"" 0"333333333333333333333333333033"" """" 33 333333333333333333333333333033""""" 3" 3333333333333333333333333333030""""" 0" 333333333333333333333333333330"" "" 330"33333333333333333333333333333""""0" 33333333333333333333333333333"""3 333333333333333333333333333330"" "33333333333333333333333333333300""333333333333333333333333333333330""33033333333333333333333333333333" 33033333333333333333333333333"" 333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333330333333333333333303333333333333033333333330333333303333030³åªå×ÍÆšìs`îV Êr¤p  - 4÷ááá ááÁÁÁ›œœ••á—E*L#7à.à:ááp45¤pC Ìsì- 4(ìsÝááá ááÁÁÁœœ›á••*E—#L.à7:àpáá