• Nenhum resultado encontrado

Propósito Geral

CAPÍTULO 4 Algoritmos em Grafos

4.2.3 Outras Abordagens

Muitos trabalhos na literatura são esforços de paralelização do algoritmo BFS. Porém, poucos voltados para implementação do problema do fecho transitivo. Uma vez que, como explicado na Seção 4.2.2, o algoritmo BFS precisa ser aplicado para cada vértice do grafo, limitando, de certa forma, o tamanho do grafo em máquinas reais.

Em 2007, Harish e Narayanan [16] implementaram um BFS paralelo utilizando CUDA e a estrutura compactada de grafos ilustrada na Figura 4.3 da Seção 4.1. O algoritmo proposto é dividido em duas fases, uma sequencial e outra paralela, sendo que a sequencial é executada na CPU e a paralela na GPU. Na fase sequencial, há a criação e a inicialização das estruturas que serão utilizadas na GPU, além de chamadas sequenciais ao kernel CUDA que representa a fase paralela do algoritmo. O Algoritmo 4.4 descreve a fase sequencial do algoritmo de Harish e Narayanan [16]. As estruturas Fa e Xasão arrays booleanos de tamanho |V |, sendo que este representa os vértices visitados e aquele os vértices da fronteira. O array de inteiros Ca mantém as distâncias do vértice de origem para cada vértice. Na fase paralela na GPU, uma thread é atribuído para cada

4.2 Fecho Transitivo 60

vértice e os vértices da próxima fronteira são adicionados em paralelo no array Fa. No Algoritmo 4.4, observa-se que a verificação de vértices na próxima fronteira é feita na CPU sequencialmente. Isso, de certo modo, dificulta o uso do algoritmo proposto no problema do fecho transitivo, pois o algoritmo seria repetido |V| vezes sequencialmente.

Algoritmo 4.4: Código CPU - Implementação do Algoritmo BFS proposta por Harish e Narayanan [16]

Cria estrutura compactada do grafo G(V, E) representada por Vae Ea Cria e inicializa os arrays Fa, Xae Cade tamanho |V |

enquanto não EMPTY (Fa) faça para cada vértice v faça

Invoca o Kernel BFS(Va, Ea, Fa, Xa,Ca) fim

fim

Hong et al [17], em 2010, propuseram um algoritmo BFS paralelo em CUDA. A fim de obter melhor desempenho, foi utilizado um modelo de programação centrado em war ps. Ao invés de atribuir um vértice para cada thread, um conjunto de tarefas foi atribuída para cada war p. Isso diminuiu o impacto da estrutura irregular do grafo na GPU. Pois, os acessos à memória das threads na war p são aglutinados na medida do possível. O algoritmo proposto [17] não é adequado para o problema do fecho transitivo. Uma vez que o objetivo apresentado pelos autores é a paralelização do algoritmo BFS que recebe como entrada grafos com certas características. Por exemplo, uma grande quantidade de vértices e arestas, e grau reduzido a 6 ou diâmetro a 10. Eles relataram 0,9 GTEPS para 32 milhões de vértices e 240 milhões de arestas na arquitetura Fermi Tesla 2050 executando somente uma única instância do algoritmo a partir de uma única origem.

Cáceres et al [7] apresentaram um algoritmo paralelo baseado no algoritmo de Warshall utilizando o modelo BPS/CGM para computar o fecho transitivo. O algoritmo utiliza logp + 1 rodadas de comunicação, O(nmp ) de computação local e O(nmp ) de espaço de em cada processador, para um grafo de entrada acíclico e direcionado, e considerado p processadores, n vértices e m arestas. Os passos do algoritmo proposto por Cáceres et al[7] são apresentados no Algoritmo 4.5.

4.3 Caminho Mínimo entre Todos os Pares de Vértices 61

Algoritmo 4.5: Algoritmo em BSP/CGM para Computar o Fecho Transitivo proposto por Cáceres et al [7]

Entrada: (1) Um grafo dirigido D = (V, E), |V | = n e vértices e |E| = m arestas; (2) p processadores;

Saída: Dt, o fecho transitivo de D;

1 Encontre uma extensão linear L de D

2 Seja S0, ..., Sp−1uma partição de V (D), cujas partes tenha cardinalidades tão iguais quanto possível, e cada Sjseja formado por vértices consecutivos em LPara j = 0, ..., (p − 1), atribua os vértices de Sj ao processador pj

3 para todo processador pj em paralelo faça 4 constrói o grafo dirigido D(Sj) de D 5 computa o fecho transitivo Dt(Sj) de D(Sj) 6 inclui em D as arestas Dt(Sj) D(Sj)

7 fim

8 Após todos os processadores terem completado o passo 3, verifique se Dt(Sj) = D(Sj), para todos os que processa pj. Se verdadeiro, o algoritmo é finalizado e D é o fecho transitivo do grafo dirigido de entrada. Caso

contrário, vá para o passo (3).

4.3

Caminho Mínimo entre Todos os Pares de Vértices

O problema do Caminho Mínimo entre Todos os Pares (APSP, All-Pair Shortest- Path) é bem conhecido na teoria dos grafos. Muitos dos problemas de redes do mundo real implicam em encontrar o menor caminho entre dois pontos quaisquer [28]. Por exemplo, problemas relacionados a banco de dados, rede de relacionamento, tráfego aéreo e terrestre, roteamento de tráfego de redes, sistemas distribuídos, ou qualquer problema que possa ser representado por um grafo no qual as arestas sejam ponderadas e cujos valores sejam linearmente acumulados à medida que a rede é percorrida [11].

Considere um grafo G = (V, E) direcionado e ponderado, o problema do caminho mínimo entre cada par de vértice consiste em identificar para cada par de vértice u, v ∈ V , o menor caminho de u até v, cujo o peso é a soma de todas as arestas do caminho.

O problema do caminho mínimo possui três variantes, além do APSP, que são [22]:

• Caminho Mínimo com uma Única Origem (SSSP, Single-Source Shortest-Path): o objetivo é computar a menor distância de um vértice dado como origem s para cada vértice v ∈ V .

4.3 Caminho Mínimo entre Todos os Pares de Vértices 62

• Caminho Mínimo para um Único Destino (SDSP, Single-Destination Shortest- Path): consiste em identificar o menor caminho dado um vértice de destino t para cada vértice v ∈ V .

• Caminho Mínimo entre um Único Par de Vértice (SPSP, Single-Pair Shortest-Path): consiste em identificar o menor caminho entre um único par de vértices.

O problema APSP é considerado uma generalização do problema SSSP [28][22]. Assim sendo, há duas formas de solucionar o problema APSP. A primeira é aplicando algoritmos que o resolvem usando a programação dinâmica, como os algoritmos de Multiplicação de Matrizes, Floyd-Warshall e Johnson1. A segunda é executando |V| vezes (algoritmos) que solucionam o problema SSSP, onde V é o conjunto de vértices. Por exemplo, os algoritmos de Dijkstra e Bellman-Ford seguem essa proposta.

Nesta seção, são mostrados em detalhes dois algoritmos sequenciais que resol- vem o problema APSP, cada qual utiliza uma técnica diferente. O primeiro é o algoritmo Floyd-Warshall e o segundo, o algoritmo de Dijkstra. Logo após, uma relação de alguns trabalhos relacionados ao problema APSP é apresentada.

Documentos relacionados