8.3.1 pvswap

x,y= PyPBLAS.pvswap(x,y)

La funcion pvswap intercambia el contenido de los datos de dos vectores que se le introducen como parametros: Es decir, la operación básica que realizan es el intecambio de valores entre los variables de tipo PyACTS x e y.

Se ha de tener en cuenta que x e y son dos variables de tipo PyACTS que pueden estar distribuidos entre los procesos de la malla de procesos configurada en la incialización del sistema. Por ejempo:

from PyACTS import *
import PyACTS.PyPBLAS as PyPBLAS
from RandomArray import *
from Numeric import *
#Dimension of Arrays
n=8
#Initiliaze the Grid
PyACTS.gridinit()
if PyACTS.iread==1:
        print "Example of using PyPBLAS: PvSWAP"
        print "N=",n,";nprow x npcol:",PyACTS.nprow,"x",PyACTS.npcol
        print "Block's size:",PyACTS.mb,"*",PyACTS.nb
        x=reshape(array(range(n)),[n,1])
        y=ones([n,1])
        print "x=",transpose(x)
        print "y=",transpose(y)
else:
        x,y=None,None
#We convert Numeric Array to PyACTS.Scalapack Array
ACTS_lib=1 # 1=Scalapack
x=Num2PyACTS(x,ACTS_lib)
y=Num2PyACTS(y,ACTS_lib)
x,y= PyPBLAS.pvswap(x,y)
if PyACTS.ictxt<>-1:
        print "x[",PyACTS.myrow,",",PyACTS.mycol,"]=",x.data
        print "y[",PyACTS.myrow,",",PyACTS.mycol,"]=",y.data
PyACTS.gridexit()
El resultado que obtenemos es el siguiente:
[vgaliano@localhost EXAMPLES]$ mpirun -np 4 mpipython exPypvswap.py
Example of using PyPBLAS: PvSWAP
N= 8 ;nprow x npcol: 2 x 2
Block's size: 2 * 2
x= [ [0 1 2 3 4 5 6 7]]
y= [ [1 1 1 1 1 1 1 1]]
x[ 0 , 0 ]= [0 1 4 5]
y[ 0 , 0 ]= [1 1 1 1]
x[ 1 , 0 ]= [2 3 6 7]
y[ 1 , 0 ]= [1 1 1 1]
x[ 0 , 1 ]= zeros((0,), 'l')
y[ 0 , 1 ]= zeros((0,), 'l')
x[ 1 , 1 ]= zeros((0,), 'l')
y[ 1 , 1 ]= zeros((0,), 'l')
En este ejemplo se han utilizado determinadas funciones de incialización de la malla de procesos que intervienen en los cálculos, y de liberación de dicha malla que ya han sido explicados y detallados en el capítulo como: "PyACTS.gridinit()" y "PyACTS.gridexit()". En el resultado mostrado por pantalla comprobamos cómo se han intercambiado los valores de x.data e y.data. Se ha de tener en cuenta en el presente ejemplo, que se ha hecho una impresión por pantalla (mediante "print "x[",...") en todos los procesos que pertenecen a la malla de procesos que se ha configurado (en este caso de dimensiones 3*2). Cada uno de los procesos imprime los valores que posea el vector a modo local, es decir el vector en este caso está distribuido en varios de los procesos que componen la malla. En determinadas ocasiones puede ser interesante recoger la totalidad del vector en uno de los procesos, con tal finalidad se ha implementado la función "PyACTS2Num" descrita en el capítulo . En este ejemplo podríamos haber recogido las variables en el proceso 0 mediante el comando:
x_global=PyACTS2Num(x)

See Sobre este documento... para sugerencias en cambios.