apuntes paralelas 2
DESCRIPTION
bUapaaPUNTESTRANSCRIPT
Capıtulo 1
Indices Invertidos y Busqueda
1.1. Motivacion
A principios de los anos noventa se propuso el modelo BSP de computacion paralela
como una metodologıa de paralelizacion de problemas clasicos en computacion cientıfica
de alto rendimiento. Entre las principales ventajas declaradas para BSP estaban la sim-
plicidad y la portabilidad del software, y la existencia de un modelo de costo que permitıa
hacer el diseno e ingenierıa de algoritmos paralelos de manera sencilla y precisa. Durante
esa decada, otros investigadores fueron mostrando que BSP tambien era capaz de abor-
dar eficientemente la paralelizacion de otras aplicaciones de Ciencia de la Computacion,
y problemas fundamentales en algoritmos y estructuras de datos discretas. El objetivo
fue proponer soluciones escalables a sistemas de gran tamano, y por lo tanto la atencion
estuvo centrada en sistemas de memoria distribuida.
La contribucion del modelo BSP al estado del arte de la epoca no fue proponer una
forma de computacion paralela completamente nueva. En realidad, ese tipo de paralelismo
ya existıa informalmente en numerosas soluciones a problemas variados. La contribucion de
BSP fue su formalizacion en un modelo de computacion paralela completo, sobre el cual el
disenador de algoritmos y software puede desarrollar soluciones sin necesidad de recurrir
a otros metodos de paralelizacion o explotar caracterısticas del hardware tales como la
topologıa de interconexion de procesadores. Posteriormente, el modelo parecio desaparecer.
Sin embargo, las ideas detras de BSP — procesamiento sincronico por lotes — han
prevalecido puesto que actualmente se les ve claramente presentes en sistemas de amplia
difusion para procesamiento paralelo en grandes clusters de memoria distribuida. Ellos
2
son Map-Reduce y Hadoop los cuales, aunque son formas restringidas de BSP, mantienen
la caracterıstica principal de BSP, es decir, su simplicidad, donde un aspecto clave en la
concrecion de esa simplicidad es que el modelo no aleja radicalmente al disenador de lo
que es una solucion secuencial intuitiva al mismo problema.
Lo anterior a nivel macroscopico, es decir, sistemas de memoria distribuida, lo que para
la aplicacion de interes en este trabajo toma la forma de clusters de nodos procesadores
que se comunican entre sı mediante una red de interconexion. A nivel microscopico, la
tendencia actual indica que dichos nodos estan formados por un grupo de procesadores
multi-core que comparten la misma memoria principal. Dichos procesadores permiten la
ejecucion eficiente de muchos threads en el nodo, donde modelos de programacion tales
como OpenMP estan especialmente disenados para explotar esta caracterıstica. OpenMP
ha alcanzado gran difusion en los ultimos anos en aplicaciones de computo cientıfico.
Curiosamente, una de las formas que promueve OpenMP para organizar la compu-
tacion realizada por los threads tambien tiene mucha similitud con BSP. Tal es ası que se
propuso recientemente una extension de BSP para procesadores multi-core (Multi-BSP).
La extension desde el modelo para memoria distribuida es casi directa puesto que los pro-
cesadores multi-core estan construidos en base a una jerarquıa de memorias. Esto se puede
ver como una distancia entre los nucleos y la memoria principal, lo cual se puede modelar
en BSP como una latencia de comunicacion entre ambas unidades.
La paradoja es que mientras para personas no expertas en computacion paralela parece
resultar incluso natural organizar sus codigos en el estilo sincronico por lotes promovido
por BSP en los noventas, al menos para la aplicacion que se estudia en este trabajo —
maquinas de busqueda para la Web — los especialistas en computacion paralela tien-
den a organizar sus soluciones como sistemas completamente asincronicos. Lo habitual es
encontrar soluciones que destinan un thread asincronico a resolver secuencialmente una
determinada tarea y donde los mecanismos principales de control de acceso a los recursos
compartidos son de tipo locks. Desde la experiencia adquirida en las implementaciones
desarrolladas en este trabajo, se puede afirmar que dichas soluciones resultan ser bastante
mas intrincadas y difıciles de depurar, que las desarrolladas utilizando el estilo BSP.
La pregunta que responde este trabajo es si el estilo BSP aplicado a nivel microscopico
viene tambien acompanado de un rendimiento eficiente. Para lograr este objetivo fue ne-
cesario disenar, analizar, implementar y evaluar estrategias sincronicas de procesamiento
de transacciones y compararlas con sus contrapartes asincronicas.
3
El requerimiento de eficiencia, tanto en rendimiento como en uso de recursos de hard-
ware es ineludible en las maquinas de busqueda para la Web. Se trata de sistemas com-
puestos por decenas de miles de nodos procesadores, los cuales reciben centenas de miles
de consultas de usuario por segundo. Entonces, es imperativo ser eficientes en aspectos de
operacion tales como consumo de energıa y cantidad de nodos desplegados en produccion.
Respecto de calidad de servicio, la metrica a optimizar es la cantidad consultas resueltas
por unidad de tiempo pero garantizando un tiempo de respuesta individual menor a una
cota superior. Por lo tanto, si se disena una estrategia de procesamiento de consultas que
le permita a cada nodo alcanzar una mayor tasa de solucion de consultas que otra estra-
tegia alternativa, la recompensa puede ser una reduccion del total de nodos desplegados
en produccion.
No obstante, aun cuando el estilo BSP alcance la misma eficiencia que la mejor estra-
tegia asincronica, la recompensa proviene desde la simplificacion del desarrollo de software
requerido para implementar los distintos servicios que componen una maquina de busque-
da. Tıpicamente, estas contienen servicios de front-end (broker), servicios de cache de
resultados, servicios de ındices y servicios de datos para ranking de documentos basado en
aprendizaje automatico. Entre estos, el servicio de ındice es el de mayor costo en tiempo
de ejecucion puesto que dicho costo es proporcional al tamano de la muestra de la Web
almacenada en cada nodo del cluster de procesadores.
Para consultas normales enviadas por los usuarios a la maquina de busqueda, no es
difıcil demostrar que, en el caso promedio, tanto un algoritmo completamente asincronico
como uno sincronico por lotes como BSP puede alcanzar un rendimiento muy similar. Sin
embargo, las maquinas de busqueda han dejado de ser sistemas en que las transacciones
(consultas) son de solo lectura. Estas han comenzado a posibilitar la actualizacion on-
line de sus ındices, lo cual implica desarrollar estrategias que sean eficientes tanto para
el procesamiento concurrente o paralelo de transacciones de lectura como de escritura.
Esto demanda desafıos mas exigentes para estas estrategias, puesto que deben resolver el
problema de los posibles conflictos de lectura y escritura cuando ocurren periodos de alto
trafico de transacciones que contienen terminos o palabras en comun. Este trabajo propone
soluciones eficientes a este problema en el contexto de servicios implementados utilizando
el enfoque BSP de paralelizacion de threads ejecutados en procesadores multi-core.
Como ejemplos de aplicaciones de maquinas de busqueda que requieren de la actuali-
zacion en tiempo real de sus ındices se pueden mencionar las siguientes.
4
En sistemas Q&A como Yahoo! Answers, miles de usuarios por segundo presentan
preguntas sobre temas variados a la base de texto, las cuales son resueltas eficiente-
mente con la ayuda de ındices invertidos. Al mismo tiempo, otros usuarios responden
con textos pequenos a las preguntas de usuarios anteriores, donde dichos textos con-
tienen palabras que coinciden con las de las respectivas preguntas, originando de
esta manera posibles conflictos entre threads lectores y escritores al momento de
actualizar el ındice invertido. Ciertamente, a los usuarios les gustarıa que sus textos
sean parte de las respuestas a las preguntas lo antes posible. Estos sistemas entre-
gan incentivos a los usuarios que proporcionan respuestas pertinentes a preguntas
de otros usuarios, aplicando votaciones sobre la calidad de las respuestas.
En sistemas para compartir fotos como Flickr, los usuarios suben constantemen-
te nuevas fotos que son etiquetadas por ellos con pequenos textos y un conjunto
pre-definido de tags describiendo el contenido. Esto permite que esas fotografıas
aparezcan en los resultados de las busquedas que realizan otros usuarios en el sis-
tema en forma concurrente. Se estima que en Flickr se suben decenas de millones
de fotografıas por dıa. Si alguien sube una fotografıa que es pertinente a un tema
que ha capturado el interes repentino de muchos usuarios, lo deseable es que dicha
imagen sea visible a las busquedas tan pronto como sea posible.
Aunque aun incipiente, un caso muy exigente de procesamiento concurrente o parale-
lo de transacciones de lectura y escrituras surge cuando se desea incluir en el proceso
de ranking de documentos, los efectos de las preferencias de usuarios anteriores por
documentos seleccionados para consultas similares, pero anteriores en la escala de
los ultimos segundos o minutos. En este caso, los clicks realizados por los usuarios
sobre los URLs presentados como respuestas a sus consultas, deben ser enviados
de vuelta a la maquina de busqueda e indexados de manera on-line. El objetivo es
utilizar estos clicks para refinar el ranking de los resultados de consultas posteriores.
Los clicks pueden ser indexados usando un ındice invertido y ahora la concurrencia
aparece entre la actualizaciones sobre el ındice y las operaciones necesarias para eje-
cutar tareas tales como la determinacion de los terminos de consultas similares y los
clicks en los documentos (URLs) relacionados con dichos terminos.
Recientemente, las principales maquinas de busqueda para la Web han comenzado
a incluir en los resultados de consultas a documentos recuperados de sistemas on-
line con cientos de millones de usuarios, muy activos en generacion de nuevos textos
pequenos, es decir, con gran probabilidad de coincidencia de palabras entre ellos,
tales como Twitter. Esto fuerza a las maquinas de busqueda a incluir estos textos
5
en sus ındices invertidos en tiempo real de manera que puedan ser incluidos en el
proceso de ranking de documentos para las consultas que se recepcionan desde sus
usuarios.
Claramente el requerimiento de actualizaciones en tiempo real de los ındices no puede
ser satisfecho por las tecnicas convencionales de realizar la indexacion de manera off-line
y luego reemplazar la copia en produccion del ındice por una nueva. Generalmente la
indexacion off-line se hace utilizando sistemas como Map-Reduce ejecutados en cluster de
computadores y sistemas de archivos distintos al cluster o los clusters en produccion. La
latencia entre ambos sistemas de archivos es grande y el proceso de copiado a todos los
nodos del cluster de produccion puede tomar varios minutos o incluso decenas de minutos.
El enfoque abordado en este trabajo es indexacion on-line, es decir, los nuevos docu-
mentos son enviados directamente a los nodos del cluster ejecutando el servicio de ındice en
produccion, y cada nodo indexa localmente los documentos recibidos al mismo tiempo que
procesa las consultas que recibe desde el servicio de front-end. Por lo tanto, el nodo debe
realizar estas operaciones de manera eficiente para evitar degradar el tiempo de respuesta
a las consultas de usuario o transacciones de lectura.
1.2. Indices Invertidos
Consiste en una estructura de datos formada por dos partes. La tabla del vocabulario
que contiene todas las palabras (terminos) relevantes encontradas en la coleccion de texto.
Por cada palabra o termino existe una lista de punteros a los documentos que contienen
dichas palabras junto con informacion que permita realizar el ranking de las respuestas
a las consultas de los usuarios tal como el numero de veces que aparece la palabra en el
documento. Ver Figura 1.1. Dicho ranking se realiza mediante distintos metodos como el
presentado en la Seccion 1.3.
Para construir un ındice invertido secuencial, es necesario procesar cada documento
para extraer las palabras o terminos de importancia, registrando su posicion y la canti-
dad de veces que este se repite. Una vez que se obtiene el termino, con su informacion
correspondiente, se almacena en el ındice invertido.
El mayor problema que se presenta en la practica, es la memoria RAM. Para solventar
esta limitacion se suele guardar de forma explıcita en disco ındices parciales cuando se
superan ciertos umbrales, liberandose de este modo la memoria previamente utilizada. Al
6
azul perro rojocasa
doc 3 1
doc 2 1 doc 1 2
doc 2 1
doc 3 1 doc 1 1
Figura 1.1: Estructura de un ındice invertido.
final de esta operacion, se realiza un merge de los ındices parciales, el cual no requiere
demasiada memoria por ser un proceso en que se unen las dos listas invertidas para cada
termino y resulta relativamente rapido.
Respecto de la paralelizacion eficiente de ındices invertidos en clusters de procesadores
de memoria distribuida existen varias estrategias. Las mas utilizadas consisten en (1)
dividir la lista de documentos en P procesadores y procesar consultas de acuerdo a esa
distribucion y en (2) distribuir cada termino con su lista completa uniformemente en cada
procesador.
1.2.1. Distribucion por documentos
Los documentos se distribuyen uniformemente al azar en los nodos. El proceso para
crear un ındice invertido aplicando esta estrategia (figura 1.2), consiste en extraer todos los
terminos de los documentos asociados a cada nodo y con ellos formar una lista invertida por
nodo. Es decir, las listas invertidas se construyen basandose en los documentos que cada
nodo posee. Cuando se resuelve una consulta, esta se debe enviar a cada nodo (broadcast).
1.2.2. Distribucion por terminos
Consiste en distribuir uniformemente entre los nodos, los terminos del vocabulario
junto con sus respectivas listas invertidas. Es decir, la coleccion completa de documentos
es utilizada para construir un unico vocabulario para luego distribuir las listas inverti-
das completas uniformemente al azar entre todos los nodos. En esta estrategia, no es
conveniente ordenar lexicograficamente las palabras de la tabla vocabulario, ya que si se
mantienen desordenadas, se obtiene un mejor balance de carga durante el procesamiento
de las consultas. Ver figura 1.3. En este caso la consulta es separada en los terminos que
la componen, los cuales son enviados a los nodos que los contienen.
7
N o d e 1 N o d e 2Figura 1.2: Estrategia de Distribucion por Documento (node= procesador).
1.2.3. Diferencias entre ambas estrategias
En el ındice particionado por terminos la solucion de una consulta es realizada de
manera secuencial por cada termino de la consulta, a diferencia de la estrategia por docu-
mentos donde el resultado de la consulta es construido en paralelo por todos los nodos. La
estrategia por documentos exhibe un paralelismo de grano mas fino ya que cada consulta
individual se resuelve en paralelo. En la estrategia por terminos solo puede explotarse
paralelismo si se resuelven dos o mas consultas concurrentemente.
Por otra parte, la estrategia de indexacion por documentos permite ir ingresando nue-
vos documentos de manera facil, el documento se envıa a la maquina id doc mod P , y se
modifica la lista local de ese nodo. Sin embargo, para el caso de ranking mediante el meto-
do del vector (descrito mas abajo), se requiere que las listas se mantengan ordenadas por
frecuencia, entonces no es tan sencillo modificar la lista. No obstante, para la estrategia
por terminos, tambien es necesario hacer esa actualizacion cuando se modifican las listas.
La gran desventaja del ındice particionado por terminos esta en la construccion del ındice
debido a la fase de comunicacion global que es necesario realizar para distribuir las listas
invertidas. Inicialmente el ındice puede ser construido en paralelo como si fuese un ındice
particionado por documentos para luego re-distribuir los terminos con sus listas invertidas.
8
N o d e 1N o d e 2
Figura 1.3: Estrategia de Distribucion por Termino (node= procesador).
1.3. Ranking de documentos
El metodo vectorial es bastante utilizado en recuperacion de informacion para hacer
ranking de documentos que satisfacen una consulta. Las consultas y documentos tienen
asignado un peso para cada uno de los terminos (palabras) de la base de texto (docu-
mentos). Estos pesos se usan para calcular el grado de similitud entre cada documento
almacenado en el sistema y las consultas que puedan hacer los usuarios. El grado de simi-
litud calculado, se usa para ordenar de forma decreciente los documentos que el sistema
devuelve al usuario, en forma de clasificacion (ranking).
Se define un vector para representar cada documento y consulta:
El vector dj esta formado por los pesos asociados de cada uno de los terminos en el
documento dj .
El vector q esta compuesto por los pesos de cada uno de los terminos en la consulta
q.
Ası, ambos vectores estaran formados por tantos pesos como terminos se hayan encontrado
en la coleccion, es decir, ambos vectores tendran la misma dimension.
9
El modelo vectorial evalua el grado de similitud entre el documento dj y la consulta
q, utilizando una relacion entre los vectores dj y q. Esta relacion puede ser cuantificada.
Un metodo muy habitual es calcular el coseno del angulo que forman ambos vectores.
Cuanto mas parecidos sean, mas cercano a 0 sera el angulo que formen y en consecuencia,
el coseno de este angulo se aproximara mas a 1. Para angulos de mayor tamano el coseno
tomara valores que iran decreciendo hasta −1, ası que cuanto mas cercano de 1 este el
coseno, mas similitud habra entre ambos vectores, luego mas parecido sera el documento
dj a la consulta q.
La frecuencia interna de un termino en un documento, mide el numero de ocurrencias
del termino sobre el total de terminos del documento y sirve para determinar cuan relevante
es ese termino en ese documento. La frecuencia del termino en el total de documentos,
mide lo habitual que es ese termino en la coleccion, ası, seran poco relevantes aquellos
terminos que aparezcan en la mayorıa de documentos de la coleccion. Invirtiendola, se
consigue que su valor sea directamente proporcional a la relevancia del termino.
Una de las formulas utilizadas para el ranking vectorial es la siguiente:
Sea {t1...tn} el conjunto de terminos y {d1...dn} el conjunto de documentos, un
documento di se modela como un vector:
di → ~di = (w(t1, di), ..., w(tk , di))
donde w(tr, di) es el peso del termino tr en el documento di.
En particular una consulta puede verse como un documento (formada por esas pa-
labras) y por lo tanto como un vector.
La similitud entre la consulta q y el documento d esta dada por:
0 <= sim(d, q) =∑
t(wq,t ∗ wd,t)/Wd <= 1.
Se calcula la similitud entre la consulta q y el documento d como la diferencia coseno,
que geometricamente corresponde al coseno del angulo entre los dos vectores. La
similitud es un valor entre 0 y 1. Notar que los documentos iguales tienen similitud
1 y los ortogonales (si no comparten terminos) tienen similitud 0. Por lo tanto esta
formula permite calcular la relevancia del documento d para la consulta q.
El peso de un termino para un documento es:
10
0 <= wd,t = fd,t/maxk ∗ idft <= 1.
En esta formula se refleja el peso del termino t en el documento d (es decir que tan
importante es este termino para el documento).
fd,t/maxk es la frecuencia normalizada. fd,t es la cantidad de veces que aparece el
termino t en el documento d. Si un termino aparece muchas veces en un documento,
se supone que es importante para ese documento, por lo tanto fd,t crece. maxk es
la frecuencia del termino mas repetido en el documento d o la frecuencia mas alta
de cualquier termino del documento d. En esta formula se divide por maxk para
normalizar el vector y evitar favorecer a los documentos mas largos.
idft = log10(N/nt), donde N es la cantidad de documentos de la coleccion, nt es
el numero de documentos donde aparece t. Esta formula refleja la importancia del
termino t en la coleccion de documentos. Le da mayor peso a los terminos que
aparecen en una cantidad pequena de documentos. Si un termino aparece en muchos
documentos, no es util para distinguir ningun documento de otro (idft decrece). Lo
que se intenta medir es cuanto ayuda ese termino a distinguir ese documento de los
demas. Esta funcion asigna pesos altos a terminos que son encontrados en un numero
pequeno de documentos de la coleccion. Se supone que los terminos raros tienen un
alto valor de discriminacion y la presencia de dicho termino tanto en un documento
como en una consulta, es un buen indicador de que el documento es relevante para
la consulta.
Wd = (∑
(w2
d,t))1/2. Es utilizado como factor de normalizacion. Es el peso del do-
cumento d en la coleccion de documentos. Este valor es precalculado y almacenado
durante la construccion de los ındices para reducir las operaciones realizadas durante
el procesamiento de las consultas.
wq,t = (fq,t/maxk) ∗ idft, donde fq,t es la frecuencia del termino t en la consulta q
y maxk es la frecuencia del termino mas repetido en la consulta q, o dicho de otra
forma, es la frecuencia mas alta de cualquier termino de q. Proporciona el peso del
termino t para la consulta q.
11
Capıtulo 2
Transacciones Concurrentes
En este capıtulo se propone realizar procesamiento sincronico por lotes a nivel de
threads como una alternativa mas eficiente y escalable que el enfoque convencional ba-
sado en threads asincronicos. Sobre esta forma de paralelismo se disenan algoritmos de
procesamiento de consultas (transacciones de lectura) y actualizacion on-line del ındice
invertido (transacciones de escritura) que muestran ser particularmente eficientes frente a
situaciones de trafico alto de transacciones.
Para un cluster con P ×D nodos procesadores, donde cada nodo contiene procesadores
multi-core que permiten ejecutar eficientemente T threads, y donde los nodos se utilizan
para mantener P particiones del ındice invertido, cada particion replicada D veces, se le
llama “nodo de busqueda” a cada nodo en que se despliega un servicio de ındice que opera
en modo exclusivo en el nodo. Se asume que a cada nodo llegan mensajes conteniendo
transacciones de lectura y escritura que deben ser procesadas en tiempo real. Dichos
mensajes son depositados en una unica cola de transacciones, las cuales son retiradas por
los threads para darles servicio. Para el conjunto de P×D nodos de busqueda, se asume que
el valor de P es tal que permite a un solo thread procesar completamente una transaccion
de manera secuencial dentro de una cota superior para el tiempo de respuesta. Se asume
que el nivel de replicacion D es tal que es posible alcanzar el throughput objetivo para la
tasa de llegada de transacciones en regimen permanente.
Lo que propone este capıtulo son soluciones eficientes para enfrentar alzas bruscas en
el trafico de transacciones, especialmente alzas en las transacciones de solo lectura, las
cuales representan las consultas de los usuarios del motor de busqueda.
12
Figura 2.1: Arquitectura de un Nodo de Busqueda.
2.1. Planteamiento del Problema
En la literatura para el diseno de motores de busqueda es posible encontrar numerosas
estrategias de indexacion y caching, las cuales pueden ser combinadas de distintas maneras
para alcanzar un rendimiento eficiente y escalable a sistemas de gran tamano y trafico
de consultas. La combinacion especıfica depende de los requerimientos que dependen de
aspectos tales como el tamano del ındice, el uso de memoria secundaria y/o compresion
del ındice, y uso de distintos tipos de caches. En particular, el diseno de un servicio de
ındice para un motor de busqueda puede tener la forma mostrada en la Figura 2.1. El
cache de listas invertidas esta formado por un gran numero de bloques que se utilizan
para almacenar grupos de ıtemes de las listas invertidas del tipo (doc id, term freq). Cada
lista, por lo general ocupa varios de estos bloques. Un cache secundario almacena los
resultados top-K de las consultas mas frecuentes resueltas por el nodo de busqueda. La
lista invertida completa de cada termino se puede mantener en el disco local al nodo o
en memoria principal en formato comprimido, es decir, se trata de una zona de memoria
relativamente mas lenta que la memoria proporcionada por los caches.
Un camino factible para los threads se ilustra en la Figura 2.2. En este ejemplo, las
consultas llegan a la cola de entrada del nodo de busqueda. Un numero determinado de
threads se encarga de resolver las consultas. Cada vez que un thread obtiene una nueva
consulta desde la cola de entrada, se comprueba si la misma ya esta almacenada en el
cache de top-K (1). Si hay un hit en este cache, el thread responde con los identificadores
de los K documentos almacenados en la entrada correspondiente (2). De lo contrario, el
13
Figura 2.2: Camino seguido por las consultas.
thread verifica si todos los bloques de las listas invertidas de los terminos de la consulta
estan en el cache de listas (3). Si es ası, el thread utiliza esos bloques para resolver la
consulta mediante la aplicacion de un algoritmo de ranking de documentos (3.a). Una
vez que el thread obtiene los identificadores de los documentos top-K para la consulta,
se guarda esta informacion en el cache de top-K aplicando una polıtica de reemplazo de
entradas del cache (4) y se envıa un mensaje con la respuesta a la consulta (5). Si faltan
bloques de listas invertidas en el cache de listas (3.b) el thread deja la consulta en una
cola de requerimientos de memoria secundaria o ındice comprimido (otro thread gestiona
esta transferencia de bloques) y comprueba si en esta segunda cola hay otra consulta
cuya transferencia de bloques al cache de listas ha sido completada para proceder con su
solucion (3.c), (4) y (5).
El enfoque anterior de procesamiento de consultas utilizando varios threads, supone
la existencia de una estrategia capaz de abordar adecuadamente la ejecucion concurrente
de las operaciones de lectura/escritura causadas por los threads en los caches y las colas.
Dado que las entradas de los caches son reemplazadas por nuevos datos constantemente,
es muy posible encontrar lecturas y escrituras concurrentes siendo ejecutadas en la mis-
ma entrada de un cache, y por lo tanto es necesario imponer un protocolo que permita
sincronizar los accesos de los threads a los recursos compartidos para prevenir conflictos
de lectura/escritura. Una solucion intuitiva es aplicar locks a las entradas del cache. Sin
embargo, el problema es mas complicado que eso como se describe a continuacion.
Luego de calcular los identificadores de los documentos top-K para una consulta, es
necesario desalojar una entrada del cache de top-K para almacenar los nuevos identifica-
14
dores top-K. Durante el mismo intervalo de tiempo, otros threads pueden estar leyendo
las entradas del cache para decidir si calcular o no los resultados de sus respectivas con-
sultas. Si el control de concurrencia se realiza a nivel grueso utilizando un lock o unos
pocos locks para proteger todas las entradas del cache, los threads pueden ser serializados
severamente. Por otro lado, mantener un lock por cada entrada del cache incrementa la
concurrencia significativamente. Sin embargo, hacer que cada thread ejecute un lock por
cada entrada que lee mientras recorre el cache secuencialmente, puede tambien producir
un efecto de serializacion de threads y dado que el costo de cada lock no es despreciable,
el tiempo de ejecucion se puede degradar y aumentar con el numero de threads. Este pro-
blema puede aliviarse utilizando estrategias como SDC donde un 80 % de las entradas son
de solo lectura (cache estatico) y un 20 % son de lectura/escritura (cache dinamico).
En el cache de listas invertidas, es necesario seleccionar rapidamente un numero sufi-
cientemente grande de bloques de cache para reemplazarlos por los bloques que contienen
los pares (doc id, term freq) de la nueva lista invertida siendo recuperada desde memoria
secundaria o desde un ındice comprimido. Para este proposito se puede utilizar una cola
de prioridad la cual permite determinar de manera exacta y eficientemente los bloques
de mayor prioridad de desalojo en el cache. Alternativamente, es posible utilizar una lis-
ta enlazada administrada con la heurıstica “mover al frente”, la cual permite obtener de
manera aproximada los bloques con mayor prioridad de ser desalojados del cache. Para la
polıtica LRU, la estrategia de mover al frente deberıa funcionar relativamente bien.
Si los bloques que contienen los ıtemes de las listas invertidas son modificados por
threads escritores, el problema de concurrencia se agrava, con la dificultad adicional que
debe haber consistencia entre los bloques almacenados en las entradas del cache y las
respectivas listas invertidas mantenidas en memoria secundaria o en memoria principal en
formato comprimido. Por ejemplo, si una estrategia de control de concurrencia se basa en
el bloqueo de las listas invertidas asociadas con los terminos de la consulta, entonces, esto
tambien deberıa provocar el bloqueo de todas las entradas del cache que mantienen los
bloques de las respectivas listas invertidas (o alternativamente el ocultamiento de estas
entradas del algoritmo de reemplazo de entradas).
Ademas, mientras un thread lee o actualiza una lista invertida ℓ, el algoritmo de
administracion de cache no debe seleccionar para reemplazo los bloques asignados a ℓ.
Al igual que en el caso anterior, una solucion sencilla es ocultar temporalmente todos los
bloques de ℓ antes que el thread los utilice. Este proceso tambien requiere de una correcta
sincronizacion de los threads y por lo tanto puede degradar el tiempo de ejecucion del
thread que esta operando sobre la lista ℓ.
15
El modificar una lista invertida tambien presenta problemas de coherencia entre la
nueva version y las posibles entradas para el mismo termino que ya estan almacenadas
en el cache de top-K. Si el nuevo ıtem que se inserta en la lista invertida tiene una
frecuencia lo suficientemente alta o mayor a la version anterior, entonces es probable que
el documento asociado pueda tambien estar presente en la respectiva entrada del cache de
top-K. En este caso, es mas practico invalidar todas las entradas del cache relacionadas
con los terminos que aparecen en las respectivas consultas, ya que la unica manera de
estar seguros es volver a calcular el ranking de la consulta. Esto genera requerimientos
adicionales de control de concurrencia en el cache, los cuales imponen una carga adicional
en uso de locks o algun otro mecanismo de sincronizacion de threads.
2.2. Solucion Propuesta
La solucion propuesta esta basada en la observacion de que si las consultas y actuali-
zaciones del ındice fueran procesadas de manera secuencial por un solo thread principal,
no serıa necesario formular una solucion para cada uno de los problemas anteriores. Por
lo tanto, lo que se propone es asignar un thread principal en el nodo de busqueda a seguir
secuencialmente los pasos descritos en la Figura 2.2, el cual recurre al despliegue de tantos
threads auxiliares como nucleos tenga el procesador para paralelizar las operaciones de
mayor costo tales como el ranking de documentos, actualizacion del ındice y la adminis-
tracion de los caches. La granularidad de las demas operaciones en terminos de costo es
muy pequena y las puede ejecutar el mismo thread principal secuencialmente utilizando
uno de los nucleos del nodo sin perdida de eficiencia. Se utiliza paralelismo sincronico para
organizar de manera eficiente las operaciones realizadas por los threads. El numero Nt de
threads disponibles para ser utilizados por el thread principal puede variar dinamicamente
en todo momento con el objetivo de permitir la ejecucion de software de mantencion y
administracion en el nodo de busqueda durante su operacion en produccion.
2.2.1. Query Solver
Las consultas son resueltas en el componente llamado query solver, el cual es el en-
cargado de recorrer las listas invertidas de todos los terminos de la consulta y aplicar el
metodo de ranking de documentos. Los elementos de cada lista invertida se agrupan en
bloques consecuentes con el tamano de las entradas del cache de listas invertidas. Se utili-
zan Nt threads para hacer el ranking de los documentos y cada thread trabaja sobre una
16
Figura 2.3: Organizacion del ındice invertido donde cada lista invertida es almacenada enun numero de bloques y cada bloque se encuentra logicamente dividido en trozos que sonasignados a cada threads. Cada trozo esta compuesto por un numero de ıtemes de la listainvertida, (doc id, freq). En este ejemplo, el primer bloque el termino term 0 es procesadoen paralelo por los threads th0, th1, th2 and th3.
seccion distinta de cada lista invertida, emulando un ındice particionado por documentos.
Por ejemplo, la Figura 2.3 (organizacion de la estructura de datos utilizada) muestra esta
situacion. La figura muestra que para el primer bloque del termino term 0, existen Nt = 4
threads trabajando en paralelo en el mismo bloque.
Dado que el rendimiento de los procesadores multi-core es altamente dependiente de la
localidad de datos, durante el procesamiento de una consulta todos los threads deberıan
maximizar el acceso a memoria local, es decir, accesos a datos almacenados en el cache
privado de los respectivos nucleos, donde los threads estan siendo ejecutados. Con este fin,
cada thread mantiene una estructura de datos llamada fast track destinada a aumentar la
localidad de referencias y por lo tanto las consultas se procesan iterativamente siguiendo
dos pasos principales:
Fetching. El primer paso consiste en leer desde la memoria principal del nodo (cache
de listas) un trozo de lista invertida de tamano K por cada termino presente en la
consulta, y por cada uno de ellos almacenar un trozo distinto de tamano K/Nt en la
memoria fast track de cada uno de los Nt threads que participan en la solucion de la
consulta. En rigor, tan pronto como un segmento de tamano K ha sido almacenado
en las Nt memorias locales, el o los bloques respectivos del cache pueden quedar
disponibles para operaciones de actualizacion dirigidas a esa seccion del ındice o
pueden ser desalojadas del cache.
Ranking. En el segundo paso, los Nt threads ejecutan en paralelo el ranking de
documentos y, si es necesario, se solicitan nuevos trozos de tamano K de las listas
invertidas (fetching) para finalmente producir los K documentos mejor rankeados
17
Figura 2.4: Insercion/Actualizacion de documentos.
para la consulta. El proceso de ranking puede implicar la determinacion de los docu-
mentos que contienen todos los terminos de la consulta, lo que implica realizar una
operacion de interseccion entre las listas invertidas involucradas.
De esta manera el proceso de ranking puede requerir varias iteraciones de la secuencia
(Fetch, Rank) en ser completado. Los documentos son asignados a los threads utilizando
la regla id doc modulo Nt, es decir, particion por documentos, lo cual aumenta la localidad
de operaciones costosas tales como la interseccion de listas invertidas. Para facilitar el uso
de memoria contigua en las transferencias, los bloques que mantienen los pares (doc id,
term freq) de las listas invertidas se pueden mantener explıcitamente particionados en Nt
sub-bloques, donde Nt indica el total de threads a ser utilizados en regimen permanente, o
implıcitamente divididos en Nt particiones almacenando todos los pares (doc id, term freq)
asignados a una particion dada en una region contigua del bloque.
Por otro lado, en la cola de entrada del nodo de busqueda tambien pueden haber
operaciones o transacciones de escritura que representen el caso en que nuevos documentos
son insertados en el ındice (insercion), o que documentos existentes sean reemplazados por
una nueva version (actualizacion). La Figura 2.4 ilustra el caso en que un nuevo documento
es insertado en el ındice, donde se muestra el efecto de la insercion en un conjunto de
terminos y secciones de las respectivas listas invertidas. Una operacion de escritura puede
modificar cualquier bloque de una lista invertida y este puede encontrarse en el cache o
en memoria secundaria o memoria comprimida. Una transaccion de escritura se procesa
distribuyendo uniformemente los terminos en los Nt threads disponibles y cada thread
modifica las respectivas listas en paralelo.
Para consultas de tipo OR (disjunctive queries), las listas invertidas son ordenadas
por frecuencia del termino en los documentos, mientras que para consultas de tipo AND
(conjunctive queries) las listas son ordenadas por identificador de documento. Esto ultimo
requiere de la interseccion de todas las listas invertidas involucradas. En este caso, es util
18
mantener las listas ordenadas por identificador de documento ya que las operaciones de
interseccion pueden tomar tiempo lineal respecto de la longitud de las listas. Para apoyar
la insercion eficiente en listas ordenadas por frecuencia, se mantienen espacios vacıos en
los bloques y se aplica una estrategia similar a la empleada en el B-Tree. Es decir, cuando
un bloque se llena, se crea uno nuevo bloque moviendo al nuevo bloque elementos tomados
desde el bloque afectado y el bloque adyacente a este.
2.2.2. Algoritmo Bulk Processing (BP Local)
La estrategia propuesta utiliza paralelismo BSP para posibilitar el paralelismo a nivel
de threads y donde las barreras de sincronizacion de threads permiten evitar los posibles
conflictos de lectura y escritura entre las transacciones. Basicamente los threads son sin-
cronizados al final de una secuencia de iteraciones realizadas para resolver una consulta
o al final de la insercion o actualizacion de un documento en el ındice invertido. Entre
dos barreras de sincronizacion consecutivas se procesa completamente una transaccion de
lectura o escritura. Los detalles se presentan en la Figura 2.5, la cual presenta un caso
donde el query solver tiene en su cola de entrada un lote de transacciones de lectura y de
escritura, y las procesa todas de una vez antes de entregar los resultados.
En el algoritmo presentado en la Figura 2.5 se utiliza una forma relajada de sincroniza-
cion de barrera que se ha disenado para reducir el costo de la sincronizacion. Tıpicamente,
una barrera de sincronizacion estandar para memoria compartida se implementa utilizan-
do una operacion “conditional wait” para hacer que los threads se bloquen en el punto
de sincronizacion. El ultimo threads despierta a todos los otros para lo cual tambien se
utiliza un contador protegido mediante un lock de acceso exclusivo. Cuando el valor del
contador es igual al total de threads, se indica el fin de la barrera y los Nt − 1 threads
bloqueados se activan. Para un sistema con gran numero de threads, la competencia por
acceder al contador y a la instruccion de espera condicional puede degradar el rendimiento
al transformarse en una fuente de serializacion de threads.
Basados en la idea de sincronizacion relajada (oblivious synchronization) para el mo-
delo BSP sobre memoria distribuida, en la Figura 2.6 se propone una version del mismo
concepto para memoria compartida, la cual usa locks y esperas condicionales. Basicamente
la idea consiste en ampliar a Nt el total de locks y esperas de manera de reducir la compe-
tencia de los threads por acceder a esos recursos compartidos. Las operaciones condWait(a,
b) y condSignal(a) tienen la misma semantica que sus homologos en Posix-threads, es de-
19
F es un trozo de tamano O(K) de memoria local al procesador.D conjunto de documentos rankeados para una consulta.R documentos mejor rankeados para una consulta.Lt es la lista invertida de un termino t.tid es el identificador del thread.pair( d, ft ) es un ıtem de lista invertida, donde ft es la frecuenciadel termino t en el documento d.
BulkProcessing( tid )
for each transaction Tn in input queue doif Tn.type == QUERY then /* read transaction */
empty( D )for each term t in Tn.query do
for each block b in Lt[tid] doF = fetch( Lt[tid][b] )rank( F , D )
endforendforRtid = getLocalTopK( D )
else /* write transaction */
for each term t in Tn.termsForThread[tid] dod = Tn.docIdif Tn.type == UPDATE then
update( Lt[tid], pair(d,ft) )else
insert( Lt[tid], pair(d,ft) )endif
endforendifObliviousBarrier( tid, Tn.id mod Nt )if (Tn.type == QUERY) and (Tn.id mod Nt == tid) then
Rglobal = getGlobalTopK( { R1, R2, ..., RNt} )
ouputQueue[ tid ].store( Rglobal )endif
endfor
EndBulkProcessing
Figura 2.5: Pasos ejecutados por cada thread en paralelo con los otros Nt − 1 threads.
20
ObliviousBarrier( my tid, tid )
set Lock( mutex[tid] )counter[tid]++if my tid == tid then
if counter[tid] < Nt thencondWait( cond[tid], mutex[tid] )
elsecounter[tid]=0
endifelse if counter[tid] == Nt then
counter[tid]=0condSignal( cond[tid] )
endif
unset Lock( mutex[tid] )EndObliviousBarrier
Figura 2.6: Sincronizacion relajada ejecutada por cada thread con identificador my tid.
cir, se bloquea b y se duerme el thread con una variable de condicion a y posteriormente
se despierta a los threads que esperan en la variable a.
Aparte de la mejora en rendimiento proveniente de la reduccion de competencia por
recursos, el costo de los locks y esperas condicionales es amortizado por la vıa del siguiente
concepto que el algoritmo BP explota para lotes de Nt o mas consultas. La ultima parte
del procesamiento de las transacciones de lectura contiene una parte secuencial en que se
determinan los mejores K documentos para la consulta. Una ventaja de la sincronizacion
relajada es que permite que esa fase sea realizada para Nt consultas en paralelo. Lo mismo
es posible con la sincronizacion de barrera estandar, pero la diferencia aquı es que cada
threads puede ingresar a esa fase tan pronto como los otros threads han terminado de
calcular sus mejores documentos locales para la consulta. Este solapamiento tiene el efecto
de amortizar los costos de la sincronizacion.
2.3. Estrategias alternativas
Como alternativas al algoritmo BP de la Figura 2.5 se tienen de la literatura actual una
serie de estrategias de control de concurrencia para transacciones de lectura y escritura.
21
Estrategia Serializable Tipo de Parallelismo SincronizacionBP Yes PRT and PWT Thread BarrierCR Yes CRT and PWT Thread Barrier
TLP1 Yes CRT (term sharing) and CWT R/W List LockingTLP2 Yes CRT (no sharing) and CWT Exclusive List LockingRBLP No non-atomic: CRT and CWT Block LockingRTLP No non-atomic: CRT and CWT Term Locking
CRT= concurrent read transactions PRT= read transaction in parallelCWT= concurrent write transactions PWT= write transaction in parallel
Tabla 2.1: Estrategias de sincronizacion de transacciones.
Estas estrategias tienden a explotar el paralelismo asincronico proporcionado por el caso
en que cada threads se hacer cargo de procesar una sola transaccion de manera concurrente
con los otros threads. Sus principales caracterısticas se resumen en la Tabla 2.1. Los pseudo-
codigos con los detalles de cada estrategia se presentan mas abajo en esta seccion. En la
tabla, la primera columna indica si la estrategia de control de concurrencia es serializable
o no. La segunda columna indica el tipo de paralelismo explotado en el procesador multi-
core, es decir, un thread por transaccion (prefijo “C”) o todos los threads sobre una unica
transaccion (prefijo “P”). La tercera columna indica la primitiva de sincronizacion que
se utiliza para sincronizar los threads y ası prevenir conflictos entre lectores y escritores
operando sobre las listas invertidas. Se enfatiza que las estrategias de sincronizacion de
transacciones deben evitar este tipo de conflictos, puesto que estos pueden provocar un
fallo en la aplicacion y llegar incluso a abortar la ejecucion del programa.
Las estrategias mas restrictivas garantizan la serializacion de las transacciones, es decir,
se mantiene la ilusion de la ejecucion en serie. Las otras estrategias pueden ser aplicadas
en escenarios donde no se exige serialidad, y potencialmente pueden ofrecer un mejor
rendimiento puesto que son mas relajadas en exigencias de sincronizacion. Al igual que la
estrategia BP, todas las estrategias utilizan el mismo esquema de fetching y ranking sobre
la estructura de fast-track del procesador. Para hacer mas justa la comparacion, todas las
estrategias contienen una cola de entrada de transacciones donde, en varios casos, el paso
fundamental hacia la serializacion es hacer un lock de acceso exclusivo a esta cola para
retirar una transaccion y luego liberar el lock tan pronto como el respectivo protocolo de
sincronizacion lo permita.
La estrategia Concurrent-Reads (CR) es similar a la estrategia BP de la Figura 2.5
en terminos de la realizacion de las operaciones de escritura utilizando todos los threads
en paralelo. La diferencia es que permite el solapamiento entre transacciones de lectura
22
a lo largo del tiempo mediante la asignacion de un thread a cada consulta. Cada thread
resuelve de principio a fin la consulta asignada. Antes de procesar una transaccion de
escritura, CR espera a que todas las transacciones concurrentes de lectura en curso hayan
finalizado (mas detalles en la Figura 2.7). De esta manera, la estrategia CR explota el
paralelismo disponible desde todas consultas activas (transacciones de solo lectura) en
un periodo de tiempo. Dado que algunos threads pueden quedar sin trabajo antes del
comienzo de la siguiente transaccion de escritura, se probo una version de CR donde los
threads sin trabajo cooperan con los demas para terminar las transacciones de lectura
en curso. Sin embargo, no se observo mejoras en el rendimiento debido a la computacion
extra que es necesario hacer para la planificacion de threads.
La estrategia Term-Level-Parallelism (TLP) permite el solapamiento entre transaccio-
nes de lectura y escritura. Cada transaccion es ejecutada por un unico thread y se utilizan
locks de exclusion mutua para proteger las listas invertidas involucradas. El lock sobre un
termino en realidad implica un lock sobre la respectiva lista invertida en forma completa.
Para garantizar la serialidad de transacciones, un thread dado no libera el lock sobre la
cola de entrada de transacciones hasta que no ha adquirido los locks de todos los terminos
que debe utilizar. Posteriormente, cada lock es liberado tan pronto como la respectiva lista
invertida ha sido procesada. Se implementaron dos versiones de TLP.
La primera version, llamada TLP1, permite transacciones simultaneas de solo lectura
sobre las mismas listas invertidas. Para esto fue necesario implementar locks de lectura,
es decir, locks que no bloquean a los threads conteniendo transacciones de lectura y que
tienen terminos en comun, mientras que los threads conteniendo transacciones de escritura
son bloqueados si comparten terminos con las transacciones de lectura. Las transacciones
de escritura utilizan locks de acceso exclusivo a las listas invertidas. Los locks son servidos
en modo FIFO lo cual garantiza la serialidad (mas detalles en la Figura 2.8).
La segunda version, llamada TLP2, es mucho mas facil de implementar puesto que
se impide el solapamiento de transacciones de lectura o escritura que tengan terminos en
comun. Esta estrategia es similar al protocolo de 2 fases de bases de datos. Una vez que
el thread adquiere el lock sobre la cola de entrada de transacciones, procede a solicitar
un lock de acceso exclusivo para cada uno de los terminos involucrados en la transaccion.
No existe posibilidad de deadlocks debido a que el lock de acceso exclusivo a la cola de
entrada de transacciones no se libera hasta que el thread ha adquirido todos los locks (mas
detalles en la Figura 2.9).
23
Tambien se estudiaron dos estrategias adicionales que relajan los requisitos de seria-
lidad y atomicidad de las transacciones. Al no adherir a estos dos requisitos, el nivel de
concurrencia de los threads aumenta significativamente. Para motores de busqueda, donde
las consultas de usuarios son respondidas en una fraccion de segundo, ambos requisitos
podrıan ser prescindibles. Para otras aplicaciones tales como sistemas de bolsa electronica
no es tan claro que estos requisitos sean prescindibles. Por otra parte, estas dos estrate-
gias son buenos representantes del mejor rendimiento que podrıa alcanzar una estrategia
optimista que cumpla al menos el requisito de atomicidad por la vıa de abortar y re-
ejecutar una transaccion para la cual se detecta que las versiones de las listas invertidas
involucradas no son las que existıan al momento de iniciar su ejecucion.
La primera estrategia, llamada Relaxed-Block-Level-Parallelism (RBLP), es similar a
TLP pero no obliga a los threads a hacer un lock de la lista invertida completa por
cada termino involucrado tanto para transacciones de lectura como para transacciones de
escritura. Las listas invertidas estan compuestas de un conjunto de bloques. Por lo tanto,
los threads van haciendo locks exclusivos solo de los bloques de las listas invertidas que se
estan procesando en un momento dado del tiempo. Es decir, es minimal, se aplica el lock
solo en la seccion de la lista invertida donde es necesario prevenir que dos o mas threads
lean y escriban los mismos ıtemes (doc id, term freq) de la lista. En la implementacion de
esta estrategia, debido a que los bloques pueden eventualmente llenarse de ıtemes y por
lo tanto dividirse, lo que se hace es aplicar locks exclusivos sobre dos bloques consecutivos
en los casos en que el numero de ıtemes dentro del bloque actual este mas alla de un valor
umbral B − Nt donde B es el tamano del bloque (es decir, existe una probabilidad de
que una transaccion de escritura divida el bloque que se ha llenado siguiendo el algoritmo
descrito al final de la Seccion 2.2.1).
Dado que no existe el requerimiento de serialidad y atomicidad, existen tres optimiza-
ciones adicionales que incrementan el nivel de concurrencia. Primero, los threads liberan el
lock de acceso exclusivo sobre la cola de entrada de transacciones tan pronto como copian
los datos de la transaccion a memoria local. Segundo, los threads liberan los locks sobre los
bloques tan pronto como van siendo copiados al fast-track, y por lo tanto el ranking de los
documentos presentes en el bloque puede involucrar una gran cantidad de computo sin que
este retardo afecte el nivel de concurrencia. En los experimentos realizados se detecto que
el costo del ranking de documentos es la parte dominante en el tiempo de ejecucion. Terce-
ro, durante la solucion de una consulta, el ranking de documentos avanza considerando un
solo bloque por cada termino en oposicion al caso de primero procesar todos los bloques
24
de un termino para pasar al siguiente. Esto reduce el nivel de contencion entre threads
que comparten terminos. Los detalles de RBLP se presentan en la Figura 2.10.
El segundo enfoque, llamado Relaxed-Term-Level-Parallelism (RTLP), es similar a
RBLP pero antes de acceder a un bloque se hace un lock del termino en lugar de lo-
ck de bloques como en RBLP. Esto evita la necesidad de tener que decidir si hacer un
lock de dos bloques consecutivos durante el recorrido de cada lista invertida. Otra ventaja
practica es la significativa reduccion en el tamano del arreglo de locks que es necesario
definir en la implementacion. En rigor, en RTLP se requiere definir una variable de tipo
lock por cada termino del ındice invertido, mientras que en RBLP es mucho mas que esa
cantidad puesto que por cada termino se tienen muchos bloques. En la implementacion de
RBLP y RTLP en realidad se utiliza un arreglo de variables de tipo lock mucho menor y
se utiliza hashing sobre ese arreglo para requerir un lock de termino y de bloque. Natural-
mente, para un mismo tamano de arreglo, la probabilidad de colisiones es mucho menor
en el caso de RTLP que en RBLP. Los detalles de la estrategia RTLP se presentan en la
Figura 2.11.
2.3.1. Detalles de estrategias alternativas
En cada caso, se tiene que
F es un trozo de tamano O(K) de memoria local al procesador.
H es el tamano de la tabla de hashing utilizada para los locks.
Lt lista invertida de un termino.
tid identificador del thread.
pair(d, ft) es un ıtem de lista invertida, donde ft es la frecuencia del termino t en el
documento d.
lockRead(t) permite a todos los lectores entrar en una zona protegida y lockWrite(t)
espera a que todos los que estan en la zona protegida terminen y luego el thread
entra en modo exclusivo.
lock(t) es un lock de acceso exclusivo.
25
global: TnW, q write = false;local: Tn;
while( true )
lock( input queue )if q write == false then
Tn = extractNextTransaction( input queue )endifif q write == false and Tn.type != QUERY then
TnW = Tn;q write = true
endifif q write == true then Tn = TnW;
unlock( input queue )
if Tn.type == QUERY then /*read transaction*/
for each term t in Tn.query dorank( Lt )
endfor
else /*write transaction*/
Barrier()for each term t in Tn.termsForThread[tid] do
d = Tn.docIdif Tn.type == UPDATE then
update( Lt, pair( d, ft ) )else
insert( Lt, pair( d, ft ) )endif
endforif tid == 0 then q write = false
Barrier()endif
endwhile
Figura 2.7: Pseudo-Codigo CR.
26
while ( true )
lock( input queue )Tn = extractNextTransaction( input queue )
if Tn.type == QUERY then /*read transaction*/
for each term t in Tn.query dolockRead( t %H )
endforunlock( input queue )
for each term t in Tn.query dorank( Lt )unlockRead( t %H )
endfor
else /*write transaction*/
for each term t in Tn.terms dolockWrite( t %H )
endforunlock( input queue )
for each term t in Tn.terms dod = Tn.docIdif Tn.type == UPDATE then
update( Lt, pair( d, ft ) )else
insert( Lt, pair( d, ft ) )endifunlockWrite( t %H )
endfor
endifendwhile
Figura 2.8: Pseudo-Codigo TLP1.
27
while ( true )
lock( input queue )Tn = extractNextTransaction( input queue )
if Tn.type == QUERY then /*read transaction*/
for each term t in Tn.query dolock( t %H )
endforunlock( input queue )
for each term t in Tn.query dorank( Lt )unlock( t %H )
endfor
else /*write transaction*/
for each term t in Tn.terms dolock( t %H )
endforunlock( input queue )
for each term t in Tn.terms dod = Tn.docIdif Tn.type == UPDATE then
update( Lt, pair( d, ft ) )else
insert( Lt, pair( d, ft ) )endifunlock( t %H )
endfor
endifendwhile
Figura 2.9: Pseudo-Codigo TLP2.
28
while( true )
lock( input queue )Tn = extractNextTransaction( input queue )
unlock( input queue )
if Tn.type == QUERY then /*read transaction*/
for each term t in Tn.query dofor each block b in Lt do
lock( b%H ); lock( (b + 1)%H )F = fetch(Lt[b])
unlock( (b + 1)%H ); unlock( b%H )rank( F )
endforendfor
else /*write transaction*/
for each term t in Tn.terms dod = Tn.docId
for each block b in Lt dolock ( b%H ); lock ( (b + 1)%H )
if isRightBlock( b, ft ) == true thenif Tn.type == UPDATE then
update( b, pair( d, ft ) )else
insert( b, pair( d, ft ) )endifunlock ( (b + 1)%H ); unlock ( b%H )next term
endif
unlock ( (b + 1)%H ); unlock ( b%H )endfor
endforendif
endwhile
Figura 2.10: Pseudo-Codigo RBLP.
29
while( true )
lock( input queue )Tn = extractNextTransaction( input queue )
unlock( input queue )
if Tn.type == QUERY then /*read transaction*/
for each term t in Tn.query dofor each block b in Lt do
lock( t %H )F = fetch(Lt[b])
unlock( t %H )rank( F )
endforendfor
else /*write transaction*/
for each term t in Tn.terms dod = Tn.docId
lock ( t %H )if Tn.type == UPDATE then
update( Lt, pair( d, ft ) )else
insert( Lt, pair( d, ft ) )endif
unlock ( t %H )
endforendif
endwhile
Figura 2.11: Pseudo-Codigo RTLP.
30
2.3.2. Protocolo optimista de timestamps
Mas adelante se muestra que las estrategias BP y RTLP alcanzan el mejor rendimiento
general para todos los casos considerados. RTLP no procesa las transacciones de manera
atomica. Sin embargo, pese a que la comparacion con BP no es justa por ser RTLP una
estrategia mucho mas relajada respecto de requerimientos de sincronizacion que BP, una
justificacion para estudiar el rendimiento de RTLP es que es una estrategia que represen-
ta lo mejor que puede lograr un protocolo optimista de sincronizacion de transacciones.
Tambien RTLP es el representante de las estrategias asincronicas que alcanza el mejor
rendimiento entre ellas. Para complementar el analisis de las estrategias de sincronizacion,
a continuacion se define (e incluye en los experimentos) una version optimista de RTLP
la cual asegura que las transacciones son atomicas.
A cada transaccion Ti se le asigna un timestamp con valor unico Ts(i) que permita
establecer un orden entre las transacciones. A cada lista invertida Lt de un termino t se
le asocian dos valores:
WTS(Lt) : Maximo de los timestamps de las transacciones que han escrito en Lt,
escritura realizada por la operacion write(Lt).
RTS(Lt) : Maximo de los timestamps de las transacciones que han leıdo Lt, lectura
realizada por la operacion read(Lt).
El protocolo es:
Si Ti intenta ejecutar read(Lt)
◦ Si Ts(i) < WTS(Lt) no se ejecuta la operacion y Ti se aborta.
◦ Si Ts(i) > WTS(Lt) se ejecuta la operacion y RTS(Lt) = max{RTS(Lt), Ts(i)}.
Si Ti intenta un write(Lt)
◦ Si Ts(i) < RTS(Lt) no se ejecuta la operacion y Ti se aborta.
◦ Si Ts(i) < WTS(Lt) no se ejecuta la operacion y Ti continua.
◦ Si no, sı se ejecuta la operacion y WTS(Lt) = Ts(i).
La actualizacion concurrente de los valores de WTS(Lt) y RTS(Lt) se protege con locks
exclusivos. Esta actualizacion tiene una duracion muy corta en tiempo de procesamiento
31
y por lo tanto estos locks de granularidad muy fina no deberıan afectar el rendimiento
significativamente.
Al abortar transaccion se debe hacer el rollback de esta y todas las transacciones que
dependen de ella, es decir, transacciones que hayan leıdo valores escritos por la primera. Es-
to es recursivo y se llama efecto cascada. El efecto cascada se puede evitar obligando a que
las transacciones solo puedan leer valores escritos por transacciones que hayan terminado,
lo cual introduce estados de espera que pueden afectar el rendimiento. El requerimiento de
rollbacks recursivos, necesarios para garantizar la serialidad de las transacciones, se puede
relajar asegurando solo la atomicidad de las transacciones. Para esto solo se re-ejecuta
la transaccion abortada sin afectar a las que dependan de ella. Esta version de RTLP es
denominada RTLP-RB (relaxed term level paralelism with roll-backs).
32
Capıtulo 3
Analisis
El modelo de costo y arquitectura estan construidos sobre el modelo de computacion
Multi-BSP. Este modelo permite abstraer el hardware real, rescatando y parametrizando
las caracterısticas esenciales que originan los costos relevantes de un algoritmo ejecutado
sobre un procesador multi-core.
Respecto del diseno y analisis de algoritmos, la estructura estrictamente sincronica
del modelo Multi-BSP permite hacer matematicamente tratable el analisis comparativo
de algoritmos disenados para resolver un mismo problema. El modelo incluye aspectos
relevantes del rendimiento de algoritmos granularidad gruesa tales como el balance de
carga entre los nucleos y el efecto de la localidad de accesos a los caches mas cercanos a
los nucleos.
3.1. El modelo Multi-BSP
El modelo Multi-BSP es una extension a procesadores multi-core con memoria compar-
tida del modelo BSP de computacion paralela para memoria distribuida. Para facilitar la
explicacion de Multi-BSP conviene recordar el modelo BSP. Un programa BSP esta com-
puesto de una secuencia de supersteps. Durante un superstep los procesadores pueden
realizar computo sobre datos almacenados en memoria local y realizar el envıo de mensa-
jes a otros procesadores. El fin de cada superstep marca el envıo efectivo de los mensajes
acumulados en el procesador y la transmision de mensajes por la red de interconexion de
procesadores finaliza con la sincronizacion en forma de barrera de todos los procesadores.
Esto implica que los mensajes estan disponibles en los procesadores de destino al inicio
33
Figura 3.1: Ejemplo de arquitectura multi-core segun Multi-BSP.
del siguiente superstep. La barrera de sincronizacion asegura que ningun procesador puede
continuar hasta el siguiente superstep sino hasta cuando todos hayan alcanzado la barrera.
En el modelo Multi-BSP el concepto de supersteps y paso de mensajes en memoria
distribuida se ha extendido para considerar el costo de transferencia entre los distintos
niveles de la jerarquıa de memoria presente en los procesadores multi-core. Al igual que en
BSP, el computo de un algoritmo Multi-BSP se divide en una secuencia de supersteps, pero
la ejecucion de un algoritmo Multi-BSP incluye explıcitamente un modelo simplificado para
estimar el costo de las transferencias entre los distintos niveles de memoria. La descripcion
formal y general del modelo Multi-BSP, la cual considera multiples niveles de anidamiento
de caches y componentes, es presentada mas abajo.
La Figura 3.1 muestra un ejemplo de un sistema de memoria compartida equipado
con 4 nucleos con sus correspondientes niveles privados de cache L1, y un nivel de cache
compartido L2. Los caches L2 estan conectados con la memoria principal. En el modelo
Multi-BSP se asume que cada thread se ejecuta en un nucleo distinto y para este ejemplo
concreto se establecen tasas de transferencia entre L1 y L2 (parametro g1), y entre L2
y memoria principal (parametro g2). Los caches L1 y L2 tienen una capacidad m1 y m2
respectivamente y se supone que la memoria principal tiene capacidad suficiente para
almacenar todos los datos del algoritmo en ejecucion.
Para simplificar el modelo y permitir calculos aproximados de forma analıtica, cada
superstep es delimitado por la sincronizacion en forma de barrera de los threads. Las
transferencias de informacion entre L1 y L2, que ocurren a una tasa g1, son efectivas al
inicio del siguiente superstep de nivel 1 y el costo de la sincronizacion de este superstep
esta dado por la latencia ℓ1. Ası mismo, las transferencias entre L2 y la memoria principal
ocurren a una tasa de g2, y son efectivas al inicio del siguiente superstep de nivel 2 a un
costo de sincronizacion dado por la latencia ℓ2. Para realizar computos, cada nucleo C1
34
o C2 debe tener los datos necesarios en su respectivo cache L1. Puesto que estos tienen
capacidad limitada, la ejecucion de un algoritmo Multi-BSP habitualmente requerira de
la transferencia de bloques de memoria entre los caches L1 y L2, y entre los caches L2
y la memoria principal (Ram). En general, las latencias ℓi acumulan tanto el costo de la
sincronizacion de barrera como todos los costos fijos que son necesarios para ejecutar los
pasos del algoritmo Multi-BSP en el superstep.
Como se observa, el modelo simplifica el comportamiento dinamico de la jerarquıa de
memoria y asume la existencia de pasos o etapas en los cuales se realizan transferencias
entre los distintos niveles de la jerarquıa de memoria. Se sabe que en un procesador real las
transferencias entre los distintos niveles se realizan de forma independiente y solapados en
el tiempo y existen tecnicas para explotar el paralelismo a nivel de memoria. No es facil por
tanto delimitar las etapas que se plantean en el modelo o ni siquiera es posible definirlas.
Tambien se sabe que existen mecanismos adicionales como los prefetcher de hardware que
actuan de forma efectiva para ocultar las latencias de acceso y que el rendimiento viene
condicionado adicionalmente por el trafico provocado por los protocolos de coherencia de
cache, que tienen gran relevancia cuando existe comparticion (falsa o verdadera) de datos.
No obstante, dada la naturaleza de la aplicacion estudiada en este trabajo de tesis, en
el analisis de caso promedio se asume que la granularidad del paralelismo que se explota
es lo suficiente grande como para obviar el trafico de coherencia y se supone que todas
las estrategias se benefician por igual de los mecanismos de ocultacion de las latencias de
acceso. Esto ultimo tiene su justificacion en el hecho de que todas las estrategias reali-
zan el mismo tipo de acceso a los datos compartidos, los cuales estan caracterizados por
secuencias largas de accesos a regiones contiguas de memoria.
Con estas simplificaciones, el costo del superstep de nivel 1 esta dado por el nucleo que
ejecuta mas operaciones en el superstep. El costo de transferencia entre L1 y L2 esta dado
por el nucleo que transfirio mas bloques al nivel L1. De la misma manera, el costo en
transferencia del superstep de nivel 2 esta dado por la unidad L2 que transfirio mas
bloques desde la memoria principal. Suponemos que las escrituras a niveles superiores de
la jerarquıa de memoria no suelen ocasionar penalizaciones importantes en el rendimiento
en nuestro contexto, ya que suponemos que no implican invalidaciones debido al protocolo
de coherencia y suponemos que no limitan el ancho de banda con memoria ya que pueden
ocultarse con los correspondientes mecanismos de buffering de escrituras. No obstante, con
la ayuda de simulacion discreta, varios de estos supuestos se relajan mas adelante en este
capıtulo para obtener un modelo de procesador multi-core mas cercano a la realidad.
35
Ambos tipos de supersteps pueden solaparse o pueden actuar en forma consecutiva en
pares, es decir, hypersteps compuestos de un superstep de nivel 1 inmediatamente seguido
de uno de nivel 2. La manera especıfica dependera del modelo de costo que mas se ajuste
a la naturaleza de los algoritmos siendo analizados o simplemente del modelo que haga el
analisis matematicamente tratable.
El modelo descrito en la forma de los dos supersteps globales de nivel 1 y 2 simpli-
fica el analisis caso promedio presentado en la siguiente seccion. Esto contrasta con los
procesadores reales los cuales, si bien tienen relojes que sincronizan globalmente sus ins-
trucciones, presentan una alta asincronıa y solapamiento de actividades entre sus distintas
unidades. Sin embargo, desde la descripcion general de Multi-BSP presentada mas abajo,
se puede concluir que este problema se puede reducir permitiendo que cada componente
pueda operar de manera asincronica respecto de los otros componentes mediante la ejecu-
cion de sus propios supersteps locales. Por ejemplo, en la Figura 3.1 cada par (nucleo-L1,
L2) y (L2, Ram) puede ser considerado como un componente asincronico. Por otra parte,
si se acota la duracion de los supersteps a un valor lo suficientemente pequeno, donde
cada actividad que no alcanzo a ser realizada en el superstep actual es planificada para
el siguiente superstep, entonces el modelo se transforma en una discretizacion del sistema
contınuo donde los componentes del procesador y los threads ejecutados sobre los nucleos
aproximan un comportamiento asincronico.
3.2. Analisis Caso Promedio
Si suponemos un sistema que admite transacciones de solo lectura, entonces no es
necesario utilizar locks o barreras para sincronizar los threads. No obstante, es relevante
mencionar que las barreras de sincronizacion utilizadas en la estrategia BP son imple-
mentadas utilizando locks e instrucciones de espera condicional. El costo de estas ultimas
es similar al costo de los locks. En general, se deberıa esperar que la cantidad de locks
ejecutados por las estrategias asincronicas sea mayor que las estrategias sincronicas. Por
ejemplo, las estrategias RTLP y RBLP descritas en el capıtulo anterior ejecutan una can-
tidad de locks que es proporcional al largo de las listas invertidas por cada transaccion,
mientras que la estrategia BP solamente incurre en un costo similar a 2 p locks por cada
transaccion, donde p es el numero de threads. Mas aun, frente a una situacion de trafico
alto de transacciones, el costo de los 2 p locks por transaccion se puede amortizar proce-
sando lotes de p transacciones en cada superstep. Esto tiene la ventaja de que los calculos
36
de los resultados top-k globales para las transacciones de lectura, pueden ser realizados en
paralelo utilizando un thread distinto despues de la sincronizacion de barrera.
Para analizar el costo de las transacciones de solo lectura y sin locks, se puede pensar en
una estrategia sincronica y otra asincronica que se comparan bajo el contexto de resolver
un flujo grande de consultas que contienen un termino t cada una. El largo de la lista
invertida del termino t es nt y cada estrategia utiliza p threads para determinar los k
documentos mejor rankeados para la consulta. Se asume que el costo de calcular el valor
de relevancia de los documentos presentes en una lista invertida es proporcional al largo
de la lista invertida.
Los parametros Multi-BSP son g1, g2 para la tasa de transferencia de bloques de ca-
che/memoria, y ℓ0, ℓ1 y ℓ2 son las latencias de sincronizacion. Se supone que las estrategias
procesan transacciones utilizando tres supersteps que operan de manera asincronica entre
ellos. Los supersteps de tipo 0 realizan computo sobre datos locales almacenados en el
cache L1 del thread. El costo de este superstep es el costo incurrido por el thread que
realizo la maxima cantidad de trabajo en el superstep.
Los supersteps de tipo 1 se utilizan para las transferencias de bloques de datos entre los
caches L1 y L2, mientras que los supersteps de tipo 2 transfieren bloques de datos entre el
cache L2 y la memoria principal del procesador multi-core. El costo de ambos supersteps
esta dado por el componente que envio y/o recibio mas datos.
Los parametros αt y βt son estimaciones de la tasa promedio de aciertos (hits) que el
termino i tiene en los caches L1 y L2 respectivamente. Se supone que cada estrategia debe
incurrir en una latencia de software constante γ para establecer lo que sea necesario para
administrar el estado de las consultas siendo resueltas. Suponemos que las p nucleos estan
organizadas de manera que se tienen c nucleos por cada cache L2, y cada nucleo tiene su
propio cache L1 local.
Si se utiliza la estrategia BP entonces cada uno de los p threads trabaja en paralelo
resolviendo una sola consulta por vez. Cada thread calcula la relevancia de cada documento
en la lista invertida del termino t y los ordena para determinar los mejores k documentos
locales a un costo O( γ + nt/p + (nt/p) · log(nt/p) + ℓ0 ). No obstante, puesto que interesa
determinar los mejores k resultados locales, no es necesario ordenar puesto que el thread
puede mantener un heap de tamano O(k) donde va manteniendo los documentos mejor
rankeados. Por lo tanto, el costo en computacion puede ser mejorado a O( γ+nt/p+(nt/p)·
log k+ℓ0 ). Para ejecutar esa cantidad de trabajo fue necesario pagar en promedio un costo
O( (1−αt)·(nt/p)·c·g1+ℓ1 ) en transferencias de datos entre los caches L1 y L2. Tambien fue
37
necesario pagar O( (1−αt)·(1−βt)·(c·(nt/p))·(p/c)·g2+ℓ2 ) = O( (1−αt)·(1−βt)·nt·g2+ℓ2 )
para la transferencias entre el cache L2 y la memoria principal.
Luego de que cada thread ha determinado sus mejores k documentos locales, uno
de ellos se hace cargo de ordenar los k · p resultados para determinar los mejores k que
constituyen la respuesta a la consulta. Dado que cada uno de los p conjuntos de tamano
k ya estan ordenados, entonces se puede hacer un merge de los p conjuntos a un costo
O( k · p · log p ). Como las CPUs estan organizadas de manera que se tienen c nucleo por
cada cache L2, entonces el costo total en transferencias de datos hasta el cache L1 del
nucleo encargado de almacenar y ordenar los k · p resultados es O( (c + p) · k · g1 + ℓ1 +
(c · k) · ((p/c) − 1) · g2 + ℓ2 ), lo cual para c constante es O( p · k · (g1 + g2) + ℓ1 + ℓ2 ). Por
otra parte, no es necesario que todos los nucleos envıen k resultados, estos pueden hacer
algunas iteraciones enviando cada vez sus siguientes k/p mejores resultados. El peor caso
es hacer p iteraciones. Con gran probabilidad luego de unas pocas iteraciones se tendran
los k mejores a nivel global. Es decir, el costo de la ordenacion (merge) se puede reducir
a O( k · log p ), lo cual tiene un costo en caches de O( k · (g1 + g2) + ℓ1 + ℓ2 ).
Para poder comparar con la estrategia asincronica es necesario considerar un grupo de
p o mas consultas, puesto que en el caso asincronico se procesan p consultas en paralelo,
donde cada consulta se procesa secuencialmente. Para trafico alto de consultas, se supone
que en un superstep de la estrategia BP se pueden procesar p consultas al mismo tiempo.
Se define para cualquier termino el caso promedio como α = αt, β = βt, n = nt. Entonces
considerando que la determinacion de los k mejores documentos finales para cada consulta
se hace en paralelo debido a la sincronizacion oblivia, el costo total de procesar p consultas
en BP esta dado por
Costo computacion Sync → p · γ + n + n · log k + k · log p + ℓ0 +
Costo caches L1-L2 → (1 − α) · n · g1 + k · p · g1 + ℓ1+
Costo cache L2-Ram → (1 − α) · (1 − β) · n · p · g2 + k · p · g2 + ℓ2 .
Para el caso de la estrategia asincronica se puede seguir un razonamiento similar con
dos importantes diferencias. Primero, la transferencia de una lista de tamano nt se hace
completamente desde el camino que va desde la Ram hasta el nucleo asignado al thread
que va a procesador el termino t. No es necesario copiar p pedazos de tamano nt/p en
los p nucleos como en el caso de BP, pero ahora el tamano del dato a transferir es p
veces mas grande, es decir, ambos costos se compensan. Por ejemplo, para competir con
BP la estrategia asincronica debe copiar p listas de tamano promedio n en los caches L2,
38
colocando c listas en cada cache y por lo tanto desde el punto de vista del componente
Ram la comunicacion es equivalente a realizar una transferencia de costo O(n ·p ·g2 + ℓ2 ).
Segundo, los resultados finales para las p consultas resueltas en forma concurrente deben
quedar en Ram, lo cual implica que este componente recibe p conjuntos de tamano k a un
costo O(k · p · g2 + ℓ2). Luego el costo total de la estrategia asincronica esta dado por
Costo computacion Async → γ + n + n · log k + ℓ0 +
Costo caches L1-L2 → (1 − α) · n · g1 + k · g1 + ℓ1+
Costo cache L2-Ram → (1 − α) · (1 − β) · n · p · g2 + k · p · g2 + ℓ2 .
Los clusters actuales para maquinas de busqueda incluyen memorias principales de
tamanos muy grandes en sus nodos multi-core. Esto implica que las listas invertidas pueden
ser muy grandes haciendo que el costo O(n) de asignar puntajes a los documentos sea
dominante. El valor de k es constante y muy pequeno comparado con el n promedio, y lo
mismo ocurre con p. Es decir, en la practica ambas estrategias deberıan tener un costo
O( n + (1 − α) · n · g1 + (1 − α) · (1 − β) · n · p · g2 ). (3.1)
Solo casos muy especiales con listas invertidas pequenas y metodos de ranking de docu-
mentos que sean muy agresivos respecto de evitar recorrer las listas completas, escapan a
la tendencia del costo de la expresion 3.1. Por otra parte, de acuerdo a la tecnologıa actual
para procesadores multi-core, uno deberıa esperar g2 ≫ g1, y entonces resulta relevante
estudiar el comportamiento de α y β en ambas estrategias.
Para diferenciarlos, ambos parametros se denominan (αS , βS) y (αA, βA) para las
estrategias sincronica y asincronica respectivamente. Para el caso asincronico un thread
puede procesar una consulta conteniendo cualquier termino t. Si el termino es frecuente,
entonces podrıa en momentos distintos ser procesado por threads distintos. Estas copias
multiples de la lista invertida en los caches de dos threads distintos puede hacer que se
reemplacen entradas del cache que contienen listas de terminos que pueden ser utilizadas
por los threads en el futuro cercano. Esto significa que la estrategia asincronica tiende a
hacer un uso menos eficiente del espacio total disponible para cache considerando la suma
del espacio sobre los p nucleos. Una solucion es utilizar una regla tal como id termino
modulo total threads. Pero si hay terminos muy frecuentes existiran problemas de balance
de carga.
Por el contrario, la estrategia sincronica siempre almacena en un y solo un cache los
segmentos de listas invertidas que necesita para resolver las consultas. Esto conduce a un
39
uso optimo del espacio total de caches sin incurrir en problemas de balance de carga. Sin
embargo, en procesadores tales como el Intel utilizado en este trabajo de tesis, el tamano
del cache L1 es bastante mas pequeno que el cache L2. En varios casos las listas invertidas
de un termino son mas grandes que el tamano completo del cache L1. No ocurre lo mismo
respecto del tamano del cache L2. Entonces con gran probabilidad lo que ocurre es lo
siguiente
αS < αA
βS > βA
Lo cual a la vista de lo presentado en la expresion 3.1 resulta favorable para la estrategia
sincronica. En la siguiente seccion se valida esta afirmacion mediante simulaciones. El caso
αS < αA ocurre en situaciones bien fortuitas y la ventaja tiende a desaparecer cuando p
aumenta.
Por ejemplo, dada una secuencia de dos terminos muy frecuentes t1 y t2 donde t1 ocurre
en las consultas qa y qc, y el termino t2 ocurre en la consulta qb. Si estas consultas llegan
al nodo multi-core en el orden qa, qb y qc, y los terminos t1 y t2, por ser muy frecuentes
tienen, por tanto listas invertidas de tamanos n1 y n2 muy grandes respectivamente, tal
que n1/p y n2/p son valores mayores a la capacidad de cualquier cache L1.
Entonces, la estrategia sincronica procesa las tres consultas en el orden qa, qb y qc, lo
cual produce que en el momento de resolver qc ya no exista en ningun cache L1 segmentos
de la lista invertida del termino t1. En cambio, la estrategia asincronica puede acumular
de una sola vez una cantidad de hits equivalentes al tamano completo de un cache L1 si
uno de los threads procesa qa y qc, mientras que un segundo thread procesa qb.
Cuando los caches son lo suficientemente grandes, como en el caso de los caches L2
del procesador Intel, entonces es evidente que la estrategia sincronica no elimina todas las
entradas para el termino t1 y por lo tanto puede acumular hits en los p/c caches L2.
3.2.1. Multi-BSP descrito de manera general
Multi-BSP es una extension del modelo BSP. Presenta multiples niveles con parametros
explıcitos dependiendo del numero de procesadores, tamano de memoria/cache, costos de
comunicacion y sincronizacion. El nivel mas bajo corresponde a la memoria compartida o
PRAM. Ver Figura 3.2.
Un modelo Multi-BSP para profundidad d queda especificado por 4d parametros
numericos (p1, g1, ℓ1, m1), (p2, g2, ℓ2, m2), (p3, g3, ℓ3, m3), ..., (pd, gd, ℓd, md). El
40
Figura 3.2: Modelo Multi-BSP para 8 nucleos.
modelo es un arbol de profundidad d con memorias/caches en los nodos internos and pro-
cesadores en las hojas. En cada nivel los cuatro parametros cuantifican, respectivamente,
el numero de sub-componentes, el ancho de banda, el costo de sincronizacion y el tamano
de la memoria o cache. En el nivel i existe un conjunto de componentes especificados por
los parametros (pi, gi, ℓi, mi), cada uno conteniendo un numero de componentes de nivel
i − 1, donde:
(a) pi es el numero de componentes de nivel i − 1 dentro de un componente de nivel i.
Si i = 1, entonces p1 es el numero de procesadores o CPUs en el componente del
nivel mas bajo. Un paso computacional en el procesador sobre datos en el nivel 1 de
memoria es considerado como la unidad basica de tiempo de ejecucion.
(b) gi el parametro para el ancho de banda de la comunicacion, es el numero de ope-
raciones que el procesador puede ejecutar en un segundo, divido por el numero de
bytes que pueden ser transmitidos en un segundo entre el componente de nivel i y la
memoria del componente de nivel i+1 del cual es parte. Se asume que las memorias
de nivel 1 tienen una velocidad suficiente como para no introducir esperas en los
procesadores, es decir, g0= 1.
(c) Un superstep de nivel i dentro de un componente de nivel i, permite a cada uno de
sus pi componentes de nivel i − 1 ejecutar operaciones independientemente hasta
que cada uno alcanza una barrera de sincronizacion. Cuando los pi componentes
han alcanzado la barrera, cada uno de sus pi componentes de nivel i − 1 puede
intercambiar informacion con la memoria de tamano mi del componente de nivel i.
El siguiente superstep de nivel i puede comenzar luego de finalizar el intercambio
41
de datos. Un costo ℓi es asignado a la barrera de sincronizacion a cada superstep de
nivel i. Se asume L1= 0, puesto que los sub-componentes de un nivel 1 no tienen
memoria y pueden leer y escribir directamente en la memoria de nivel 1.
(d) mi es el numero de bytes de memoria y caches dentro de un componente de nivel i,
que no esta dentro de ningun componente de nivel i − 1.
Los parametros del modelo pueden ser determinados empıricamente mediante la ejecucion
de programas de benchmark en el procesador, o pueden ser estimados desde la especifica-
cion tecnica del procesador. Por ejemplo, para un procesador Niagara T1 que contiene p
nucleos, los parametros pueden ser los siguientes:
Nivel 1: 1 core tiene 1 procesador con 4 threads mas un cache L1:
(p1 = 4, g1 = 1, ℓ1 = 3, m1 = 8KB).
Nivel 2: 1 chip tiene 8 nucleos mas un cache L2:
(p2 = 8, g2 = 3, ℓ2= 23, m2 = 3MB).
Nivel 3: p multi-core chips con memoria externa m3 accesada vıa una red con tasa g2:
(p3 = p, g3 = ∞, ℓ3 = 108, m3 ≤ 128GB).
42
Capıtulo 4
Comparacion de Estrategias
4.1. Evaluacion utilizando un Servicio de Indice
En los experimentos que siguen se considera que siempre el conjunto de listas invertidas
requeridas para procesar una transaccion se encuentra disponible en el cache de listas.
Las evaluaciones realizadas no consideran el costo de administracion del cache. En una
experimentacion separada se evalua el rendimiento de la propuesta de cola de prioridad
para la administracion del cache de listas. La motivacion para separar ambos experimentos
es en primer lugar simplicidad y precision de los resultados, y en segundo lugar es el hecho
de que si la estrategia BP se comporta mejor que las alternativas asincronicas en el caso
de listas siempre residentes en memoria principal, entonces este mismo enfoque debe ser
aplicado a la administracion del cache.
Se asume que la tasa de llegada de transacciones es lo suficientemente alta como para
mantener ocupado a todos los threads. La metrica principal de interes es la tasa de salida
de transacciones, es decir, el throughput. Esto porque todas las estrategias son capaces de
resolver una transaccion en una fraccion de segundo.
Las listas invertidas fueron construidas desde una muestra de la Web de UK proporcio-
nada por Yahoo!. La Figura 4.1 muestra la distribucion del largo de las listas invertidas y la
distribucion de terminos en los documentos. Para las transacciones de lectura se utilizo un
log de consultas real que contiene busquedas de usuarios sobre dicha Web. El texto de los
documentos que participan en las transacciones de escritura fue tomado desde la misma
Web. La generacion del flujo de transacciones (traza) que llegan al nodo de busqueda se
43
0
5000
10000
15000
20000
0 100 200 300 400 500 600 700
Len
gth
of
inver
ted l
ists
per
ter
m
Terms
Web UK
0
1000
2000
3000
4000
5000
6000
0 100 200 300 400 500 600
Num
ber
of
term
s
Document IDs
Web UK
(a) (b)
Figura 4.1: (a) Largo de listas invertidas ordenadas de mayor a menor largo, y largosmostrados cada 50 listas (Web UK). (b) Distribucion de numero de terminos en los docu-mentos.
realiza mezclando de manera aleatoria las consultas de usuarios con documentos existentes
en la base de documentos.
La Figura 4.2 muestra la proporcion de terminos que figuran en el log de consultas y
que estan contenidos en alguno de los documentos de la base de documentos. En el eje
y se refleja la proporcion de terminos del log que estan en los documentos, y el eje x la
cantidad de documentos en unidades de diez mil. La figura indica que existe gran proba-
bilidad de conflictos de escrituras/lecturas con al menos un termino cuando se procesan
inserciones/actualizaciones de documentos en conjunto con las consultas de los usuarios.
Tambien se muestra la distribucion de la cantidad de terminos que tienen las consultas de
los usuarios.
La proporcion de nuevos documentos y consultas se controla por parte del generador
de trazas con el fin de poder disponer de un campo de exploracion lo suficientemente
extenso. Ademas el generador de trazas tambien permite elegir el grado de conflicto entre
consultas consecutivas, es decir la posibilidad de encontrar terminos identicos en busquedas
proximas. Esto se traduce en accesos simultaneos a las lista invertidas correspondientes.
Un grado de conflicto alto se traduce en que la mayorıa de las consultas poseen algun
termino comun con las 40 busquedas mas proximas. De igual modo un grado de conflicto
bajo conlleva la existencia de, como maximo, un 10 % de las busquedas con algun termino
en comun en las 40 consultas mas proximas.
44
0
0.2
0.4
0.6
0.8
1
140120100806040200
Normalized Frequency
0
2000
4000
6000
8000
10000
12000
14000
1 2 3 4 5 6 7 8
Fre
quen
cy
Number of Terms
(a) (b)
Figura 4.2: (a) Frecuencia de ocurrencia de los terminos del log de consultas en los docu-mentos de la base de texto. (b) Distribucion del numero de terminos en las consultas.
4.1.1. Sobre el tamano de bloque
Antes de presentar los resultados de cada estrategia, se presentan resultados que mues-
tran el impacto del tamano de bloque para las listas invertidas. El tamano del bloque afecta
de maneras distintas a cada estrategia. Por ejemplo, para las estrategias RBLP y RTLP
existe un compromiso entre la cantidad de computacion requerida para administrar cada
bloque, donde bloques mas grandes demandan una menor cantidad de tiempo consumido
en administracion, y el nivel de concurrencia que es posible alcanzar, donde bloques mas
pequenos mejoran el nivel de concurrencia alcanzado por la estrategia, pero a la vez se
incrementa el numero de locks ejecutados, los cuales consumen cierta cantidad de tiempo
de ejecucion. Para todas las estrategias el tamano de bloque tambien afecta la localidad
de referencias en los caches del procesador.
El rendimiento para consultas tipo OR se muestra en la Figura 4.3. Los resultados
indican que cada estrategia alcanza un optimo para un mismo tamano de bloque para
la lista procesada en cada thread. Este optimo se alcanza para bloques de tamano 64.
En la estrategia BP el optimo para los valores del bloque son mayores a 64, pero estos
deben ser divididos por el total de threads para obtener el tamano de bloque de la lista
invertida siendo procesada en cada thread. Este valor de tamano de bloque se mantiene
para consultas AND y los distintos tipos de cargas de trabajo aplicadas a los threads. Los
resultados mostrados en las secciones que siguen utilizan este tamano optimo de bloque
en cada estrategia.
45
50
55
60
65
70
16 32 64 128 256 512 1024 2048
nQ
uer
ies/
sec
nThreds
CRBP
TLP1TLP2RTLPRBLP
110
115
120
125
130
135
140
16 32 64 128 256 512 1024 2048
nQ
uer
ies/
sec
nThreds
CRBP
TLP1TLP2RTLPRBLP
180
200
220
240
260
280
16 32 64 128 256 512 1024 2048
nQ
uer
ies/
sec
nThreds
CRBP
TLP1TLP2RTLPRBLP
250
300
350
400
450
500
550
16 32 64 128 256 512 1024 2048
nQ
uer
ies/
sec
nThreds
CRBP
TLP1TLP2RTLPRBLP
Figura 4.3: Throughput alcanzado por las diferentes estrategias con distinto tamano debloque.
4.1.2. Resultados
La Figura 4.4 muestra el rendimiento alcanzado cuando la carga de trabajo contiene
transacciones de lectura y escritura. Estos son los resultados para consultas de tipo OR
(disjunctive queries). Cada grupo de barras muestra las ejecuciones para 1, 2, 4 y 8 threads.
En cada grafico, la carga de trabajo tiene una proporcion distinta de transacciones de
lectura y escritura, manteniendo constante el numero de total de transacciones procesadas.
Puesto que la insercion o actualizacion de un documento toma un tiempo mucho menor
a la solucion de una consulta, a medida que aumenta el porcentaje de transacciones de
escrituras en la carga de trabajo, se reduce el tiempo total de ejecucion. Es decir, la tasa
de transacciones procesadas por segundo (throughput) aumenta. En promedio, el tiempo
de solucion de una transaccion esta por debajo de los 16 milisegundos.
46
0
100
200
300
400
500
600
1 2 4 8
Tra
nsa
ctio
ns
per
Sec
ond
nThreads
CRBP
TLP1TLP2RTLPRBLP
0
100
200
300
400
500
600
700
800
900
1 2 4 8
Tra
nsa
ctio
ns
per
Sec
ond
nThreads
CRBP
TLP1TLP2RTLPRBLP
0% writers 10 % writers
0
200
400
600
800
1000
1200
1 2 4 8
Tra
nsa
ctio
ns
per
Sec
ond
nThreads
CRBP
TLP1TLP2RTLPRBLP
0
200
400
600
800
1000
1200
1400
1 2 4 8
Tra
nsa
ctio
ns
per
Sec
ond
nThreads
CRBP
TLP1TLP2RTLPRBLP
20% writers 30 % writers
Figura 4.4: Throughput (transacciones por segundo) alcanzado por las estrategias paradiferentes tasas de escritura y consultas OR, y un total de 40 mil transacciones.
Los resultados de la Figura 4.4 muestran dos aspectos relevantes para la estrategia
BP. Primero, la estrategia BP escala eficientemente con el numero de threads indepen-
dientemente de la proporcion de transacciones de escritura. BP supera a todas las demas
estrategias a medida que aumenta el numero de threads y para mas de dos threads la
aceleracion es super-lineal debido a la gran tasa de hits en el cache L2 que alcanza esta
estrategia. Solo RTLP y RBLP logran un rendimiento competitivo, pero a expensas de
la perdida de atomicidad y serialidad de las transacciones. Segundo, BP logra un ren-
dimiento bastante similar a la estrategia CR para el caso de solo lecturas (0 % writers).
Esto representa a los motores de busqueda convencionales que no actualizan sus ındices
de manera on-line y asignan un thread concurrente a cada consulta activa. Los resultados
47
indican que cualquiera de las estrategias pueden ser usadas en este caso, pero la ventaja
de utilizar BP es que el mismo enfoque de paralelizacion sincronica puede ser aplicado a la
administracion de los caches de top-K y listas, y por lo tanto se logra un mejor rendimiento
ya que en los caches ocurren operaciones de lectura y escritura en una proporcion de 50 %.
Las estrategias CR y TLP1 solamente alcanzan resultados satisfactorios para tasas
bajas de transacciones de escritura. TLP2 no tiene un buen rendimiento debido a que las
transacciones de lectura incluyen terminos que coinciden ocasionalmente. Estas coinciden-
cias causan demoras sustanciales en la ejecucion de los threads que comparten terminos.
Esto debido a que cuando un thread obtiene el lock de la lista compartida, no lo libera
hasta ejecutar la operacion de ranking de documentos sobre la lista completa. Luego los
threads que le suceden deben esperar por la liberacion del lock. Tambien, los terminos que
se repiten en las transacciones tienden a ser terminos populares que, por lo mismo, tienen
listas invertidas muy largas y el tiempo de ejecucion del ranking es proporcional al largo
de las listas. Esto introduce retardos que degradan el rendimiento significativamente.
Una tendencia similar se observa cuando la carga de trabajo incluye consultas AND
(conjunctive queries). Los resultados se muestran en la Figura 4.5. Para este caso el rendi-
miento de BP respecto de las otras estrategias es relativamente mejor que para el caso de
consultas OR. En general, el throughput alcanzado para consultas AND es muy superior
que el alcanzado para las consultas OR puesto que el ranking se hace sobre listas invertidas
mucho mas pequenas, es decir, las listas que resultan de realizar la interseccion entre las
listas de los terminos de cada consulta.
Los graficos de la Figura 4.6 muestran resultados para una carga de trabajo en la que
se aumenta significativamente el nivel de coincidencia entre terminos. Ver figuras 4.6.a y
4.6.b para consultas OR, y figuras 4.6.c y 4.6.d para consultas AND. Para consultas OR
los resultados muestran la misma tendencia a lo observado en los graficos de la Figura 4.4.
Para consultas AND, los resultados muestran que el rendimiento relativo de RBLP y RTLP
con respecto a BP, es relativamente mejor que el alcanzado en los graficos de la Figura 4.5.
En este caso el ranking opera sobre listas mucho mas pequenas y por lo tanto su costo es
mucho menor que en consultas OR, lo cual reduce los tiempos de espera por locks.
Los resultados mostrados a continuacion tienen que ver con tiempos promedio de
transacciones individuales para consultas OR. La Figura 4.7.a muestra el tiempo pro-
medio de respuesta para las transacciones, mientras que la Figura 4.7.b muestra el tiempo
de respuesta maximo observado cada 1000 transacciones procesadas utilizando 8 threads.
La estrategia BP logra el menor tiempo esperado en cada caso, especialmente en el tiempo
48
0
500
1000
1500
2000
2500
3000
3500
4000
4500
5000
1 2 4 8
Tra
nsa
ctio
ns
per
Sec
ond
nThreads
CRBP
TLP1TLP2RTLPRBLP
0
1000
2000
3000
4000
5000
6000
7000
1 2 4 8
Tra
nsa
ctio
ns
per
Sec
ond
nThreads
CRBP
TLP1TLP2RTLPRBLP
0% writers 10 % writers
0
1000
2000
3000
4000
5000
6000
7000
8000
1 2 4 8
Tra
nsa
ctio
ns
per
Sec
ond
nThreads
CRBP
TLP1TLP2RTLPRBLP
0
1000
2000
3000
4000
5000
6000
7000
8000
9000
10000
1 2 4 8
Tra
nsa
ctio
ns
per
Sec
ond
nThreads
CRBP
TLP1TLP2RTLPRBLP
20% writers 30 % writers
Figura 4.5: Throughput (transacciones por segundo) alcanzado por las estrategias paradiferentes tasas de escritura y consultas AND, y un total de 40 mil transacciones.
maximo de respuesta para una transaccion. Los resultados para BP son evidentes, pues-
to que por construccion de BP el tiempo esta acotado a la maxima lista procesada en
el perıodo. Debido al tipo de paralelismo que se utiliza en BP, esta estrategia garantiza
tiempos maximos no superiores a O( ℓmax/Nt ) donde ℓmax es el tamano maximo de las
listas invertidas. Bajo situaciones de trafico alto de transacciones, los resultados de las
figuras 4.4 y 4.5 muestran que BP es mas estable y capaz de entregar un rendimiento
mas eficiente que las otras estrategias. Por lo tanto, la cota superior para el tiempo de
respuesta individual de una transaccion es menos suceptible de ser sobrepasado frente a
trafico alto puesto que en BP, al tener un throughput mayor, los tiempos de espera en la
49
0
100
200
300
400
500
600
1 2 4 8
Tra
nsa
ctio
ns
per
Sec
ond
nThreads
CRBP
TLP1TLP2RTLPRBLP
0
200
400
600
800
1000
1200
1400
1 2 4 8
Tra
nsa
ctio
ns
per
Sec
ond
nThreads
CRBP
TLP1TLP2RTLPRBLP
(a) 0% writers, OR (b) 30% writers, OR
0
500
1000
1500
2000
2500
3000
3500
4000
4500
1 2 4 8
Tra
nsa
ctio
ns
per
Sec
ond
nThreads
CRBP
TLP1TLP2RTLPRBLP
0
1000
2000
3000
4000
5000
6000
7000
1 2 4 8
Tra
nsa
ctio
ns
per
Sec
ond
nThreads
CRBP
TLP1TLP2RTLPRBLP
(c) 0% writers, AND (d) 30% writers, AND
Figura 4.6: Throughput alcanzado por las estrategias para diferentes tasas de escrituray consultas OR y AND, y un total de 40 mil transacciones. Trazas con alto grado decoincidencia entre terminos de transacciones consecutivas.
cola de entrada de transacciones tienden a ser menores que en las otras estrategias con
throughput inferior.
4.2. Evaluacion utilizando un Servicio de Click-Through
Las maquinas de busqueda para la Web generalmente hacen un seguimiento de los clicks
realizados por los usuarios en las paginas web que contienen los resultados de busquedas.
Esto permite considerar las preferencias de usuarios anteriores en el proceso de ranking
de documentos para una consulta dada. La maquina de busqueda registra todos los clicks
50
0
0.002
0.004
0.006
0.008
0.01
0.012
0.014
0.016
0.018
1 2 4 8 1 2 4 8 1 2 4 8
Aver
age
tim
e per
com
ple
ted o
per
atio
n
Number of threads
0% writers 20% writers 40% writers
CRBP
TLP1TLP2RTLPRBLP
(a) Tiempo medio de respuesta por transaccion.
0
0.05
0.1
0.15
0.2
0.25
1 2 3 4 1 2 3 4
Max
imu
m t
ime
per
co
mp
lete
d o
per
atio
n
Batches of query/index operations
0% writers 40% writers
CRBP
TLP1TLP2RTLPRBLP
(b) Maximo tiempo de respuesta por transaccionpara lotes de 1,000 transacciones y 8 threads.
Figura 4.7: Tiempo en segundos para transacciones de lectura/escritura.
de los usuarios sobre los URLs presentados en las respuestas a sus consultas. Por cada
consulta resuelta y respondida por la maquina de busqueda, en algun momento retornan
a la maquina de busqueda los URLs visitados por el respectivo usuario.
Actualmente las optimizaciones al proceso de ranking de documentos que consideran
las preferencias de usuarios anteriores, provienen de calculos realizados de manera off-line
sobre grandes conjuntos de consultas y sus respectivos user clicks. Esto significa que los
efectos de clicks anteriores a ser incluidos en el proceso de ranking de documentos, solo
se ven reflejados a intervalos de horas o incluso dıas. Una solucion es permitir la inclusion
de user-clicks de manera on-line y mantener un servicio que permita, por cada consulta
51
que llega a la maquina de busqueda principal, recepcionar una copia de cada consulta y
realizar en tiempo real el calculo de un puntaje para los documentos mas visitados por
usuarios que realizaron consultas similares en el pasado muy reciente.
Basicamente el problema consiste en tener un ranking eficiente de las URLs clickeadas
por usuarios anteriores que solicitaron informacion similar a la maquina de busqueda. Para
ello, los clicks deben ser indexados de manera concurrente con el ranking, y los conflictos
de concurrencia surgen por las continuas actualizaciones del ındice y las operaciones ne-
cesarias determinar las consultas similares y realizar el ranking de URLs. Las consultas
son “similares” si se encuentran correlacionadas de alguna manera, para este calculo se
consideran los URL seleccionados y los respectivos terminos de las consultas. El calculo
de las probabilidades consulta-consulta, consulta-URL y URL-URL puede ser exigente en
tiempo ejecucion y espacio de memoria.
El servicio de click-through fue implementado utilizando un ındice invertido que con-
tiene una tabla con los terminos que aparecen en las consultas, y por cada termino los
URLs seleccionados por los usuarios junto con informacion de la cantidad de clicks hechos
sobre el URL. Por otra parte, como se muestra en la Figura 4.8, se utiliza un ındice adicio-
nal de modo que a partir de un conjunto de URLs se pueda llegar a nuevos terminos. Una
operacion basica es comenzar con los terminos de la consulta recibida por el servicio para
llegar hasta el conjunto de URLs relacionados con esos terminos, y a partir de esos URLs
llegar a mas terminos y URLs. Luego de reunir una cantidad lo suficientemente grande
URLs se aplica una rutina de ranking de URLs para responder con los top-K a la maquina
de busqueda.
4.2.1. Diseno de los experimentos
Los resultados mostrados a continuacion estan representados en terminos de la ace-
leracion, la cual se define como la razon A/B, donde A es el menor tiempo de ejecucion
obtenido por cualquiera de las estrategias utilizando un thread, y B es el tiempo de eje-
cucion obtenido por la estrategia utilizando dos o mas threads. Los experimentos fueron
realizados evaluando dos escenarios para las transacciones que arriban a la cola de entrada
del nodo multi-core:
Workload A – Trafico de transacciones alto pero concurrencia limitada –. Es el
escenario mas adverso que se ha evaluado puesto que existe una alta probabilidad de
que las consultas posteriores (en la secuencia de llegada de transacciones al nodo) a
52
Figura 4.8: Estructuras de datos y secuencia de operaciones. La secuencia (1), (2) y (3)indica que a partir de un termino dado (1) es posible llegar a un nuevo termino (2), quea su vez conduce a un nuevo conjunto de URLs (3), los cuales se incluiran en el procesode ranking. Para cada ıtem (URL, freq) del ındice invertido, esta secuencia se repite paracada elemento de la lista del segundo ındice.
una consulta dada sean muy similares, conteniendo muchos terminos en comun. Por
ejemplo, esto emula una situacion en que repentinamente un cierto evento o tema
capta la atencion de muchos usuarios de la maquina de busqueda. En este caso, las
operaciones de ranking de URLs y actualizacion de los ındices tienden a coincidir
muy frecuentemente sobre el mismo subconjunto de terminos.
Workload B – Alto trafico, alta concurrencia –. Este caso es lo opuesto en el sentido
que la probabilidad de terminos en comun entre transacciones es menor, es la normal
observada en el log de consultas AOL que se utilizo en la experimentacion, y por lo
tanto la competencia por las mismas secciones de los ındices es mucho menor que
en Workload A. Dado que existe una menor correlacion entre consultas posteriores,
existe un nivel de concurrencia mayor.
53
Las transacciones de actualizacion de los ındices contienen documentos escogidos al azar
desde los resultados top-K de cada consulta del log de AOL. Las respuestas a las consultas
fueron calculados utilizando ranking vectorial sobre las listas invertidas construidas desde
la muestra de la Web de UK. Para estas transacciones de escritura, lo que recibe el nodo
multi-core desde el exterior son los terminos de la consulta y los URLs que selecciono el
usuario que originalmente envıo la consulta a la maquina de busqueda. Si los URLs son
nuevos, es decir, no existen en el ındice entonces se trata de una operacion de insercion
en las listas invertidas respectivas. Si son URLs que ya existen en el ındice, entonces es
una operacion de actualizacion que modifica la frecuencia de clicks sobre el URL para los
terminos de la consulta. La cantidad de URLs, y los URLs especıficos, son valores definidos
aleatoriamente con distribucion uniforme. Evidentemente esto no representa exactamente
las preferencias de los usuarios frente a la pagina de resultados, pero para el proposito de
la experimentacion que concierne a este trabajo dicho supuesto es suficiente para evaluar
el rendimiento de las estrategias de control de concurrencia. Los experimentos consideran
casos en que el respectivo usuario selecciona uno o varios URLs.
Las transacciones de lectura son consultas del log de AOL y para simular el grado de
colisiones de terminos en las transacciones, se asume que una consulta resuelta por el nodo
multi-core en el instante t1, retorna al nodo como una transaccion de escritura (compuesta
de la misma consulta y los URLs seleccionados por el usuario) en el instante t2 > t1 luego
de haber procesado una cierta cantidad de otras transacciones.
4.2.2. Resultados
La Figura 4.9 muestra la escalabilidad de las diferentes estrategias utilizando el caso
workload B con seleccion de un URL para las transacciones de escritura y cinco URLs.
Los resultados muestran que BP es la estrategia que escala mejor que las otras estrategias
para ambos casos.
Algo similar se observa en la Figura 4.10, la cual muestra resultados para las dos cargas
de trabajo ejecutadas utilizando 8 threads y variando la cantidad de URLs que contienen
las transacciones de escritura. Ambas cargas de trabajo tienen la caracterıstica de que el
peso del proceso de ranking de URLs es mucho menor que en el caso de estudio anterior
sobre el servicio de ındice. Esto porque las listas invertidas que se forman con los URLs
tienen tamano mucho menores a las utilizadas por el servicio de ındice.
54
0
50
100
150
200
250
300
1 2 4 8
Thro
ughput
nThreads
1 click
CRBP
TLP1TLP2RTLPRBLP
0
100
200
300
400
500
600
700
1 2 4 8
Thro
ughput
nThreads
5 clicks
CRBP
TLP1TLP2RTLPRBLP
Figura 4.9: Escalabilidad de las diferentes estrategias para Workload B y suponiendo quelos usuarios hacen un click (grafico izquierdo) en un enlace en cada busqueda o hacen clicksen 5 enlaces (grafico derecho), los cuales se transforman en 5 transacciones de escritura.
Los resultados de la Figura 4.10 muestran que el rendimiento de las estrategias, con
excepcion de TLP2, son relativamente independientes del nivel de la carga de trabajo. La
explicacion es que si bien workload A posee mayor nivel de conflicto, en todo momento
existen tantas transacciones como threads en ejecucion y por lo tanto la probabilidad de
coincidencia de terminos esta acotada.
Finalmente, en la Figura 4.11 se muestran los tiempos promedio de ejecucion individual
por consultas e insercion/actualizacion. Distinto al caso de la Figura 4.7, para calcular los
tiempos de respuesta de transacciones individuales se ha medido directamente el intervalo
de tiempo que transcurre entre el inicio y el final del procesamiento de la transaccion.
El grafico de la Figura 4.11.a muestra que el tiempo promedio de las transacciones que
tienden a ser similares entre sı. Para 5 clicks los tiempos son menores, lo cual indica que las
operaciones de insercion/actualizacion son mas rapidas que las consultas sobre los ındices.
A excepcion de la estrategia BP, todas las estrategias asignan un threads para procesar de
forma secuencial la consulta y/o insercion/actualizacion. Sin embargo, BP tiene la carga de
la barrera de sincronizacion de threads con el fin de comenzar con la siguiente operacion,
y los resultados muestran que este costo es significativo. Por otra parte, los puntos de
la Figura 4.11.b muestran claramente que todas las estrategias tienden a consumir una
cantidad significativa de tiempo para algunas operaciones, lo cual indica que de vez en
cuando, se produce un retraso debido a la contencion de locks de los threads activos.
La estrategia BP no sufre este problema, sencillamente, procesa las operaciones de una
a la vez y, si bien usa locks para implementar la barrera de sincronizacion oblivious, los
55
0
200
400
600
800
1000
1200
1 2 3 5 10
Thro
ughput
Clicks
CRBP
TLP1TLP2RTLPRBLP
0
200
400
600
800
1000
1200
1 2 3 5 10
Thro
ughput
Clicks
CRBP
TLP1TLP2RTLPRBLP
Figura 4.10: Escalabilidad de las diferentes estrategias para Workload A (grafico izquierdo)y Workload B (grafico derecho) para 8 threads y varios clicks indicados en el eje x.
threads no deben competir entre sı para adquirir locks al final de cada operacion. Esto
explica mejor el rendimiento de BP con respecto a la metrica de resultados en este caso,
es decir, rendimiento de las operaciones consultas/insercion/actualizacion.
4.2.2.1. Experimentos con mas threads
Para complementar los resultados mostrados en la Figura 4.4 obtenidos con el proce-
sador Intel Xeon Quad-Core, en la Figura 4.12 se muestran resultados para un procesador
de tecnologıa reciente, Intel i7, el cual contiene tres niveles de cache y cuyo rendimiento
es superior. Este procesador permite el uso de hasta 24 threads de manera eficiente. Los
resultados muestran que las diferencias relativas en rendimiento de las distintas estrategias
son similares a lo presentado en la Figura 4.4. Para transacciones de solo lectura todas las
estrategias alcanzan un rendimiento muy similar.
4.2.3. Resultados considerando roll-backs
En la Figura 4.13 se muestran resultados para el throughput alcanzado por la estrategia
optimista utilizando un simulador por eventos discretos del procesador Intel, consideran-
do hasta 128 threads con cada thread siendo asignado a un nucleo distinto. En el rango
entre 1 y 8 threads, los resultados muestran una tendencia en rendimiento bastante si-
milar a lo observado para las implementaciones reales de las estrategias. Para mas de 8
56
0
0.005
0.01
0.015
0.02
0.025
0.03
1 2 4 8 1 2 4 8
Av
erag
e ti
me
per
co
mp
lete
d o
per
atio
n
Number of threads
1 click 5 clicks
CRBP
TLP1TLP2RTLPRBLP
(a) Tiempo medio de respuesta por transaccion.
0
0.0001
0.0002
0.0003
0.0004
0.0005
0.0006
0.0007
1 2 3 4 5 1 2 3 4 5
Max
imu
m t
ime
per
co
mp
lete
d o
per
atio
n
Batches of query/index-update operations
1 click
5 clicks
BPCR
TLP2TLP1RTLPRBLT
(b) Maximo tiempo de respuesta por transaccionpara lotes de 1,000 transacciones y 8 threads.
Figura 4.11: Tiempo individual de transacciones. Parte superior se muestran los resultadosde ejecucion del tiempo promedio para 1, 2, 4 y 8 threads. En la parte inferior se muestrael tiempo maximo observado cada 1000 transacciones procesadas para 8 threads.
threads se observa que las estrategias RTLP y RTLP-RB no escalan eficientemente con
el total de threads. El simulador revela que se producen esperas muy largas por los lo-
cks entre transacciones que comparten terminos frecuentes, y la tasa de roll-backs crece
significativamente cuando existen transacciones de escritura.
La Tabla 4.1.a revela la razon de la perdida de rendimiento de la estrategia RBLP-RB.
La cantidad de roll-backs (columnas RB) aumenta hasta el punto de que poco mas de la
57
0
500
1000
1500
2000
4 6 8 12 16 24
Tra
nsa
ctio
ns
per
Sec
ond
nThreads
CRBP
TLP1TLP2RTLPRBLP
0
500
1000
1500
2000
2500
3000
4 6 8 12 16 24
Tra
nsa
ctio
ns
per
Sec
ond
nThreads
CRBP
TLP1TLP2RTLPRBLP
10% writers 40 % writers
Figura 4.12: Throughput alcanzado por las estrategias para diferentes tasas de escrituray consultas OR, y un total de 40 mil transacciones en un procesador Intel i7.
20% 40%NT RB LB RB LB2 0.04 1 0.06 0.954 0.10 0.95 0.13 0.988 0.18 0.95 0.21 0.8916 0.26 0.92 0.31 0.8732 0.33 0.82 0.42 0.7864 0.41 0.70 0.51 0.69128 0.46 0.56 0.57 0.41
0% 40%NT Pw LB Pw LB2 0 1 0 14 0.01 0.99 0.01 18 0.02 0.99 0.03 116 0.04 0.97 0.09 132 0.06 0.94 0.14 0.9964 0.10 0.88 0.17 0.97128 0.21 0.84 0.37 0.90
(a) 20 % and 40% writers (RTLP-RB) (b) 0% and 40% writers (RTLP)
Tabla 4.1: Razones de la perdida de rendimiento de las estrategias RTLP-RB y RTLP.
mitad de las transacciones deben ser re-ejecutadas. La tabla tambien muestra el efecto que
dichos roll-backs tienen en el balance de carga (columnas LB) de las computaciones ejecu-
tadas por los nucleos. El balance de carga se mide considerando la cantidad computacion
realizada por los threads en los nucleos. Para esto se calcula el promedio de computacion
observado en los threads dividido por el maximo observado en cualquiera de los threads.
Los valores de la Tabla 4.1.a muestran el balance de carga promedio para intervalos gran-
des de tiempo de simulacion. Los resultados muestran que el balance de carga se degrada
significativamente a causa de los roll-backs, donde el balance optimo se alcanza en 1 y el
desbalance extremo para valores cercanos a 0.
58
0
100
200
300
400
500
600
1 2 4 8
Thro
ughput
nThreads
BPRTLP
RTLP-RB
0
1000
2000
3000
4000
5000
6000
7000
8000
9000
10000
16 32 64 128
Thro
ughput
nThreads
BPRTLP
RTLP-RB
0% writers, 1 to 8 threads 0% writers, 16 to 128 threads
0
200
400
600
800
1000
1200
1400
1600
1800
2000
1 2 4 8
Thro
ughput
nThreads
BPRTLP
RTLP-RB
0
5000
10000
15000
20000
25000
30000
35000
16 32 64 128
Thro
ughput
nThreads
BPRTLP
RTLP-RB
40% writers, 1 to 8 threads 40% writers, 16 to 128 threads
Figura 4.13: Throughputs que el modelo de simulacion predice para las estrategias BP,RTLP y RTLP con Rollbacks (RTLP-RB), en el procesador Intel.
La Tabla 4.1.b muestra resultados que explican la perdida de rendimiento de la es-
trategia RTLP cuando aumenta considerablemente el total de threads que participan en
la solucion de las transacciones. Existe una probabilidad no despreciable de que para
cualquier transaccion un thread dado tenga que esperar por un lock. Esta probabilidad
aumenta con el numero de threads (columnas Pw ). Esto hace que se pierda gradualmente
el balance de carga (columnas LB).
4.2.4. Mas resultados utilizando un simulador por eventos discretos
La Figura 4.14 muestra las variaciones en el tiempo de respuesta de transacciones in-
dividuales al final de periodos dados por el procesamiento de un lote de transacciones. Los
59
0
0.1
0.2
0.3
0.4
0.5
1 2 3 4 5 1 2 3 4 5
Tim
e per
tra
nsa
ctio
n
Batches of query/index-update operations
BP RTLP
0
0.1
0.2
0.3
0.4
0.5
1 2 3 4 5 1 2 3 4 5
Tim
e per
tra
nsa
ctio
n
Batches of query/index-update operations
BP RTLP
0 % writers 40% writers
Figura 4.14: Tiempos de respuesta de transacciones recolectados a intervalos regulares deltiempo de simulacion para 8 threads.
resultados muestran que BP mantiene tiempos bajos de respuesta y que RTLP ocasional-
mente supera el tiempo de procesamiento secuencial de la transaccion debido a esperas
por la asignacion de locks.
La Tabla 4.2 verifica las conclusiones del analisis del caso promedio (Seccion 3.2). La
tasa de hits L1 de la estrategia RTLP es mucho mejor que los hits L1 alcanzados por
la estrategia BP. No obstante, la tasa de hits en los caches L2 que alcanza BP es muy
superior a la tasa de hits que alcanza la estrategia RTLP, y al menos en el procesador
Intel las transferencias de datos desde memoria principal al cache L2 toman mas tiempo
en concretarse que las transferencias entre L1 y L2. Tambien debido a que los segmentos
de listas invertidas en la estrategia RTLP tienden a estar replicados en varios caches L2, el
total de invalidaciones de entradas de cache tiende a ser mayor en RTLP que en BP para
un numero grande de threads. En las simulaciones con 40 % de escrituras se observo la
secuencia (NT, VRTLP /VBP )= (16, 1.14), (32, 1.26), (64, 1.34) y (128, 1.40), donde VRTLP
y VBP indican el total de entradas de invalidadas en los cache L1 y L2 para las estrategias
RTLP y BP respectivamente.
El efecto del mejor uso de la localidad en la arquitectura del procesador simulado que
realiza la estrategia BP se puede observar en la Figura 4.15. En este caso se simula una
situacion de granularidad muy fina reduciendo el costo del proceso de ranking de docu-
mentos a un valor 100 veces menor. Los resultados muestran que en este caso la estrategia
RTLP no escala eficientemente mas alla de 8 threads. En todos los casos la estrategia BP
60
Hits cache L10 % W BP RTLP BP/RTLPNT= 1 0.00 14.07 0.00
2 0.00 18.81 0.004 0.00 21.16 0.008 0.00 23.82 0.0016 0.02 30.94 0.0032 0.05 40.83 0.00
Hits cache L140% W BP RTLP BP/RTLPNT= 1 0.00 6.70 0.00
2 0.00 8.02 0.004 0.00 8.30 0.008 0.00 11.90 0.0016 0.10 18.05 0.0132 0.37 22.77 0.02
Hits cache L20% W BP RTLP BP/RTLPNT= 1 0.05 0.99 0.05
2 7.64 6.59 1.164 54.89 16.09 3.418 118.84 21.00 5.6616 157.06 22.77 6.9032 177.02 22.29 7.94
Hits cache L240% W BP RTLP BP/RTLPNT= 1 1.08 4.15 0.26
2 8.53 6.75 1.264 20.30 8.51 2.398 29.27 8.48 3.4516 36.03 7.87 4.5832 40.98 7.46 5.49
Tabla 4.2: Total de aciertos (cache hits) en los caches L1 y L2. Valores en millones deaciertos cada 10 mil transacciones.
alcanza tiempos de ejecucion mas eficientes para esta situacion de granularidad muy fina.
Se hace enfasis en que el modelo de simulacion de la arquitectura del procesador es el
mismo en ambas estrategias.
Tambien dado que la estrategia RTLP alcanza un rendimiento escalable cuando la
granularidad del ranking es cercana a lo real (Figura 4.13), los resultados de la Figu-
ra 4.15 sirven para comprobar que el efecto de la arquitectura del procesador es menos
relevante en el rendimiento general de las estrategias de sincronizacion de transacciones.
Los factores relevantes son aspectos tales como el balance de carga y los tiempos de espera
por la asignacion de solicitudes de locks. La cantidad total de locks ejecutados por BP is
directamente proporcional al total de threads mientras que para RTLP el total de locks
ejecutados es constante. Para 128 threads, la estrategia BP ejecuta un total de locks que
es 8 veces menor al total de locks ejecutados por RTLP.
61
0
0.2
0.4
0.6
0.8
1
2 4 8 16 32 64 128
No
rmal
ized
ru
nn
ing
tim
e
Number of threads
BP 40% WRTLP 40% W
BP 20% WRTLP 20% W
BP 100% RRTLP 100% R
Figura 4.15: Tiempos totales de ejecucion normalizados a 1 para un caso en que se simulagranularidad fina haciendo que el costo del ranking de documentos sea 100 veces menor.
62