PDF de programación - Práctica 4 Estudio del procesador Cell

Imágen de pdf Práctica 4 Estudio del procesador Cell

Práctica 4 Estudio del procesador Cellgráfica de visualizaciones

Publicado el 17 de Marzo del 2019
320 visualizaciones desde el 17 de Marzo del 2019
239,3 KB
10 paginas
Creado hace 6a (23/09/2013)
Práctica 4

Estudio del procesador Cell

1

Práctica 4



Estudio del procesador Cell



1. Objetivos

El objetivo de esta práctica es que el alumno aprenda a programar el procesador Cell y pueda sacar el máximo
rendimiento de su arquitectura multicomputador y SIMD. Con esta práctica el alumno pondrá de manifiesto y
medirá el aumento de rendimiento obtenido por el procesamiento paralelo de la arquitectura Cell y el de las
instrucciones vectoriales SIMD.



2. Introducción

En esta sección se explicarán las nociones básicas de la arquitectura Cell así como su programación utilizando el
sistema operativo Linux instalado en una PlayStation 3. Una buena descripción de la programación del
en Cell Broadband Engine Programming Handbook
procesador Cell
(CBE_Handbook_v1.1_24APR2007_pub.pdf).

encontrar

se

puede



2.1 Arquitectura del procesador Cell

El procesador Cell está compuesto por un procesador escalar maestro PowerPC Processing Element (PPE) y
ocho procesadores independientes que son los Synergistic Processing Element (SPE). Todos estos componentes
están conectados con un bus llamado Element Interconnect Bus.

Fig. 1: Dos esquemas del procesador Cell mostrando su arquitectura



2.1.1 El PPE: PowerPC Processing Element

Se trata de un procesador escalar clásico de 64 bits con arquitectura PowerPC lo que le permite ejecutar sistemas
operativos y programas estándar para esta familia. Tiene instrucciones RISC de 32 bits con 64 registros de 64
bits, también posee una unidad de cálculo vectorial SIMD Altivec de 128 bits. El papel del PPE es sobre todo el
de ejecutar el programa principal y el de lanzar los programas alojados en los SPE.


Laboratorio de Ampliación de Arquitectura de Computadores-2013/2014


Arquitectura y Tecnología de Computadoras

Práctica 4

Estudio del procesador Cell

2

2.1.2 Los SPE: Synergistic Processing Element

Se componen de una unidad de cálculo vectorial Streaming Processor Unit (SPU) de tipo SIMD, una memoria
local (Local Store) de 256 Kb y un Memory Flow Controler (MFC) para los accesos a la memoria principal. El
SPE sólo tiene acceso a su memoria local, por lo que los datos deben ser transferidos desde la memoria principal
a la local antes de realizar ningún cálculo. Las transferencias entre memoria local y principal se realizan a través
de la unidad MFC mediante transacciones de tipo DMA (Direct Memory Access). Estas transacciones las puede
iniciar el PPE o el SPE indistintamente.

El SPE puede ejecutar instrucciones vectoriales SIMD de 128 bits siendo el tamaño del vector variable
dependiendo del tipo de datos que contenga. Por ejemplo, los vectores son de 4 elementos si contienen enteros o
flotantes (4x4 bytes=128bits) mientras que sólo tiene 2 elementos si contienen flotantes dobles (2x8 bytes).

2.1.3 El EIB: Element Interconnect Bus

Es un bus interno del procesador Cell que conecta todos los elementos de este. Todos los intercambios y los
accesos entre los componentes (SPE, PPE, memoria e interfaces de E/S) se hacen mediante este bus. Cada
elemento tiene una conexión de 16 bits de escritura y otros 16 bits de lectura con este bus.



2.2 Programación del procesador Cell

Cada elemento procesador, tanto PPE como SPE, ejecuta su propio programa. Dado que el PPE y los SPE
presentan arquitecturas diferentes, cada uno tiene su propio compilador. El PPE ejecuta normalmente el
programa principal y es el encargado de lanzar los programas presentes en los SPE. Para ello se dispone de un
puntero global en el programa del PPE que apunta al programa del SPE (o varios punteros si cada SPE ejecuta un
programa diferente). El valor de esta variable se establece en el momento de la compilación si los programas del
PPE y SPE se compilan juntos, o durante la ejecución del programa principal si es el PPE el que carga en
memoria el programa del SPE en tiempo de ejecución.

Al inicio se ejecuta el programa del PPE que es el encargado de crear los contextos de ejecución para cada SPE.
Existen varios modelos de programación según el papel de cada elemento, el más clásico consiste en que el PPE
asigna una tarea a un SPE (o a varios) que la ejecuta y devuelve el resultado al PPE. También se puede
programar en modo streaming de manera que un SPE hace un primer cálculo y le pasa el resultado a un segundo
que hace un segundo cálculo y así sucesivamente. En este modelo cada SPE o grupo de SPE efectúa una acción
diferente sobre los datos. También se puede usar double buffering lo que permite solapar los tiempos de copia
con el tiempo de cálculo.

Aparte de las transacciones DMA entre memoria local y principal, existe la posibilidad de que los diferentes
componentes del procesador se comuniquen entre sí mediante buzones de correo, de manera que existe un buzón
de entrada y otro de salida por cada SPE y el PPE.

2.2.1 Compilación de un programa simple

Tal como se ha dicho anteriormente se usa un compilador diferente para el PPE y el SPE. La compilación de un
programa para el Cell necesita tres etapas: Primero hay que compilar el código del SPE con el programa spu-gcc.
Segundo se usa la herramienta ppu-embedspu para convertirlo a un fichero tipo ELF (Executable and Linking
Format) y poder exportar el inicio del programa en una variable global para que el PPE sepa dónde comienza el
código de programa. Estas dos primeras etapas se deben repetir por cada programa diferente que ejecuten
diferentes SPE; si todos los SPE ejecutan el mismo programa (cosa habitual por otro lado) sólo es necesario
repetir este paso una vez. Por fin se compila el código del PPE con el compilador gcc estándar por ejemplo
enlazándolo con los ficheros objetos de cada programa que se ejecute en el SPE.

El caso más simple y habitual es que todos los SPE ejecuten la misma tarea como si de una arquitectura SIMD se
tratara (aunque no lo es). El fichero makefile para compilar el programa de los SPE (spe.c) y el del PPE (ppe.c)
para generar el programa prog sería:

OPT = -W -Wall
SPUFLAG = $(OPT)
PPUFLAG = -D_REENTRANT $(OPT) -m64

LD = -lspe2 -lpthread


Laboratorio de Ampliación de Arquitectura de Computadores-2013/2014


Arquitectura y Tecnología de Computadoras

Práctica 4

Estudio del procesador Cell

3


prog: spe.c ppe.c
# Compilacion del codigo del SPE

# Exportacion del codigo del SPE en la variable spe_code

# Compilacion del codigo del PPE


gcc ppe.c spe.o $(PPUFLAG) $(LD) -o prog

spu-gcc spe.c $(SPUFLAG) -o spe

ppu-embedspu spe_code spe spe.o



En el compilador se pueden añadir las opciones clásicas que sean necesarias como cualquier otra compilación
clásica. En estos programas se añaden siempre las librerías spe2 y pthread pues la primera contiene las
herramientas básicas de manejo de los SPE y la segunda contiene lo necesario para la creación de hilos, pues la
ejecución de cada programa en un SPE se va a controlar con un hilo para cada SPE.

2.2.2 Programación

El papel del PPE es principalmente el de organizar la ejecución del programa y asignar las tareas a los SPE. La
primera tarea del programa del PPE es la creación de los contextos de ejecución, uno por cada SPE usado. La
segunda consiste en cargar en este contexto un programa que es el que va a ser ejecutado sobre el SPE
correspondiente. La última etapa es la de iniciar la ejecución sobre el SPE mediante una llamada que se bloquea
hasta el fin de la ejecución del SPE. No se puede elegir un SPE en particular, sino que el sistema elige el SPE
que le conviene. Dado que la llamada al programa del SPE se bloquea hasta que termina, es necesario usar los
pthread para poder continuar usando el PPE para lanzar más ejecuciones en otros SPE o simplemente que
continúe el programa mientras los SPE hacen su labor. Lo normal es que el PPE lance los programas de los SPE
y espere a que terminen todos los hilos para recoger los resultados y continuar.



Creación de un contexto de ejecución



A continuación se hace una descripción rápida de las funciones más útiles para la preparación de un contexto de
ejecución, la descripción completa se encuentra en el documento SPE Runtime Management Library (libspe-
v2.0.pdf).

spe_context_ptr_t spe_context_create(unsigned int flags, spe_gang_context_ptr_t gang)

Esta función crea un contexto de ejecución y devuelve su puntero o NULL en caso de error. El argumento flags
permite definir opciones como SPE_EVENT_ENABLE y otras. El argumento gang permite agregar este
contexto a un gang (grupo de SPE). En el caso más sencillo y habitual simplemente haremos
contexto=spe_context_create(0,NULL)



int spe_context_destroy (spe_context_ptr_t spe)

Esta función permite destruir un contexto. Tiene que ser usada al final de la ejecución de un contexto.



int spe_program_load (spe_context_ptr_t spe, spe_program_handle_t *program)

Carga en el contexto spe el programa cargado en memoria en la dirección program. Esta dirección se ha obtenido
tal como se explica en la sección de compilación del programa (es la variable spe_code del makefile). En el
programa del PPE la definiremos globalmente como extern spe_program_handle_t spe_code;



int spe_context_run (spe_context_ptr_t spe, unsigned int *entry, unsigned int runflags, void *argp, void *envp,
spe_stop_info_t *stopinfo)

Esta función lanza la ejecución del contexto sobre un SPE sin que podamos elegir un SPE en particular. La
llamada a esta función se bloquea hasta que se termina el programa del SPE, por eso
  • Links de descarga
http://lwp-l.com/pdf15529

Comentarios de: Práctica 4 Estudio del procesador Cell (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios
Es necesario revisar y aceptar las políticas de privacidad