Click here to load reader

An Efficient Parallel Implementation of an Optimized ... · biblioteca para programação linear foi encontrada, em [7], porém não há no descritivo a presença de ... deverá ser

Embed Size (px)

Citation preview

  • 1AbstractThe general-purpose graphics processing unit

    programming has been widely used and has achieved satisfactory results across many knowledge areas and it keeps evolving since its earlier stages. This paper presents an implementation of a modified Simplex method using the computational power brought from graphics processing unit (GPU) computing using the Nvidia framework for GPU programming, compute unified device architecture (CUDA). The results achieved shown that the parallel GPU implementation reached 15x and 22x maximum speedup measuring the overall time (data transfer plus kernel work time) and the kernel computation time respectively, in comparison with the standard sequential implementation using central processing unit (CPU).

    Keywords CUDA, GPU Computing, GP-GPU, Linear Programming, Operational Research, Optimization, Parallel Computing, Simplex

    I. INTRODUO LGORITMOS de otimizao so cada vez mais utilizados em vrias reas do conhecimento, como

    engenharia, finanas, dentre outras [1]. A programao linear um dos mtodos matemticos usados para encontrar solues, viveis ou timas, para problemas de otimizao [2]. Em cenrios reais de aplicao, onde o modelo matemtico do problema pode conter centenas ou milhares de restries, a complexidade e o tempo de execuo desses algoritmos crescem de forma exponencial, levando a um custo computacional elevado e um tempo de execuo no hbil para tais demandas. Com o intuito de se minimizar os custos computacionais de um problema de otimizao denso, essas demandas so submetidas a algoritmos que trazem resultados no timos para o problema, porm num tempo de execuo aceitvel. Os recentes estudos na rea de computao heterognea e computao de propsito geral em GPU (general-purpose graphics processing unit - GPGPU) demonstram que a utilizao dessa tecnologia de paralelismo na aplicao de problemas de programao linear leva a resultados timos em tempos de execuo satisfatrios [3] [4] [5]. Citado na lista dos dez algoritmos mais importantes do sculo 20 [6], o mtodo Simplex se destaca entre os

    Artigo submetido para reviso em 31/05/2017. V. O. Silva, Pontifcia Universidade Catlica de Minas Gerais (PUC-MG),

    Belo Horizonte, Minas Gerais, Brasil, [email protected] P. Y. Ekel, Pontifcia Universidade Catlica de Minas Gerais (PUC-MG),

    Belo Horizonte, Minas Gerais, Brasil, [email protected] C. A. P. S. Martins, Pontifcia Universidade Catlica de Minas Gerais

    (PUC-MG), Belo Horizonte, Minas Gerais, Brasil, [email protected]

    algoritmos utilizados para resolver problemas de programao linear. Alguns fatores que caracterizam o problema motivador para o desenvolvimento deste trabalho so:

    Apenas uma implementao open-source de uma biblioteca para programao linear foi encontrada, em [7], porm no h no descritivo a presena de paralelismo utilizando GPU para tal biblioteca.

    Curva de aprendizagem de paradigmas para computao de propsito geral em GPU rasa.

    Tempo para domnio e implementao computacional de um mtodo de resoluo de problemas de programao linear alto.

    Comparao entre duas abordagens do mtodo Simplex, implementando ambas de modo sequencial em CPU e de modo paralelo utilizando GPU.

    O principal objetivo deste trabalho essencialmente a implementao de uma melhoria algortmica no mtodo Simplex, que seja capaz de superar o desempenho da implementao tradicional do algoritmo. Tanto a implementao tradicional quanto a modificada so implementadas de modo sequencial, utilizando CPU, e de modo paralelo, utilizando GPU, esperando-se que as verses com melhoria algortmica superem o desempenho em todos os casos, seja sequencial ou paralelo.

    Um objetivo secundrio deste trabalho a possibilidade de se utilizar esta implementao na forma de uma biblioteca de otimizao para problemas de programao linear. Sua funo ser de abstrair a complexidade de se utilizar os recursos de computao de propsito geral em GPU, utilizando a application programming interface (API) CUDA como suporte programao de propsito geral em unidades de processamento grfico (GPGPU). A biblioteca desenvolvida dever ser capaz de encontrar a soluo tima, se houver, para problemas de otimizao de modelos de programao linear densos e de larga escala, com centenas ou milhares de variveis e restries, no menor tempo possvel. Tal biblioteca poder ser reaproveitada de forma genrica para outros sistemas, de reas de engenharia e afins, que necessitem solucionar problemas de programao linear.

    Do ponto de vista cientfico, este trabalho apresenta uma implementao eficiente de um mtodo de programao linear para resolver problemas de otimizao, densos ou esparsos, e de larga escala, utilizando recursos de computao paralela proporcionados pelo uso de processamento de propsito geral em GPU.

    An Efficient Parallel Implementation of an Optimized Simplex Method in GPU-CUDA V. O. Silva, Member, IEEE, P. Y. Ekel and C. A. P. S. Martins, Senior Member, IEEE

    A

    564 IEEE LATIN AMERICA TRANSACTIONS, VOL. 16, NO. 2, FEB. 2018

  • Outro ponto de vista importante, o fato deste trabalho gerar uma biblioteca, assim como ferramentas auxiliares que podem ser utilizadas para futuros estudos de caso e pesquisas na rea de otimizao. Levando em considerao a vasta gama de reas do conhecimento que demandam de sistemas capazes de resolver problemas de otimizao de larga escala em tempo hbil, estes podero ser beneficiados pela utilizao dessa biblioteca. Todo o cdigo desta implementao est disponibilizado num repositrio pblico de cdigos-fonte [8], podendo beneficiar outras pesquisas da rea de GPGPU, e livre para contribuies e/ou evolues da biblioteca.

    Este trabalho possui o seguinte escopo: Analisar e construir um mecanismo eficiente de

    resoluo para problemas de programao linear de forma paralela, utilizando o processamento de propsito geral em GPU.

    Construir o mesmo algoritmo de forma sequencial em CPU para propsitos de comparao com a verso paralela.

    Construir uma biblioteca que utiliza a verso paralela do algoritmo em GPU para propsito de reuso e interoperabilidade.

    Essa biblioteca dever ser capaz de receber dados manualmente e importar dados atravs de um arquivo de entrada do tipo mathematical programming system (MPS).

    Propor melhorias no algoritmo e/ou analisar possveis tcnicas de otimizao para um melhor cenrio paralelo de implementao.

    Como contribuies tcnicas, foram desenvolvidas as seguintes implementaes e ferramentas auxiliares, disponveis em [8] visando atingir os objetivos propostos:

    Implementao com interface grfica do mtodo Simplex modificado. O programa desenvolvido visa mostrar, usando uma interface intuitiva, o processo do algoritmo proposto. Foi utilizada a linguagem Visual Basic .Net para a construo do programa.

    Implementao sequencial e outra paralela, usando CUDA, de uma abordagem tradicional do mtodo Simplex em C++ e CUDA. Implementao sequencial e outra paralela, usando CUDA, do mtodo Simplex modificado em C++ e CUDA.

    Gerador de problemas de programao linear com parmetros de quantidade de variveis, restries e esparsidade parametrizveis.

    Transcritor de problemas de programao linear para o padro MPS.

    Na seo 2 deste artigo apresentado, de forma simplificada, o mtodo Simplex original e a verso modificada. Na seo 3 so apresentados os principais trabalhos relacionados. Na seo 4 apresentada a implementao paralela em GPU-CUDA do algoritmo modificado. Na seo 5 apresentada a estrutura da biblioteca criada para invocar a implementao do Simplex. Na seo 6 apresentamos os resultados. Na stima seo so apresentadas as concluses do trabalho.

    II. O MTODO SIMPLEX Apresentado em 1947 pelo matemtico norte-americano

    George Bernard Dantzig, e publicado no livro de sua autoria (vide [2]), o mtodo Simplex ainda o mtodo mais utilizado na atualidade para resolver problemas de programao linear e tem boa aceitao nas vrias reas do conhecimento onde aplicado.

    Um problema de programao linear consiste na maximizao, ou minimizao, de uma funo objetivo linear contendo n variveis, submetidas a um conjunto de m restries. Para existir espao para um ambiente de otimizao neste sistema de equaes lineares, obrigatoriamente a funo objetivo deve estar submetida a um conjunto de no mnimo n+1 restries, sendo n o conjunto de variveis no-bsicas da funo objetivo. Formalmente, um problema de programao linear possui a seguinte descrio matemtica:

    max !! = !!!,

    !. !. : !!!! !!,# 1 !! 0

    Sendo, !! = !!, !!, , !! !,# 2

    !! = !!,! !!,! !!,!!!,! !!,! !!,!

    !!,! !!,! !!,! ! ! !# 3

    E,

    !! = !!, !!, , !! ! ,# 4 Sendo n a quantidade de variveis, e m a quantidade de restries no sistema linear (vide [3]).

    Inicialmente, o primeiro passo do mtodo simplex consiste em introduzir variveis artificiais, ou variveis de folga, nas restries do problema, com o objetivo de tornar as inequaes das restries em igualdades [2]. O resultado dessa alterao da forma padro do sistema linear resulta no que se chama de forma cannica do problema inicial [2]. Somente a partir da forma cannica o mtodo simplex pode ser aplicado. A partir dessa forma cannica do sistema, possvel construir uma tabela no formato de matriz, denominada tableau simplex. O tableau utilizado para uma execuo manual do mtodo simplex, sendo utilizado para um melhor domnio e entendimento do algoritmo.

    Utilizando a forma cannica obtida, o mtodo simplex aplicar uma sequncia de operaes de articulao, separado em duas fases. A primeira fase determina se o problema possui soluo, gerando uma nova forma cannica na qual o algoritmo de segunda fase poder ser executado. Caso a primeira fase de articulao tenha sucesso, o algoritmo executa uma segunda fase de articulao, que tem o objetivo de determinar a soluo tima do sistema [2]. As duas fases de articulao do algoritmo, consistem na determinao de um elemento piv (ou elemento permissvel) dentro do tableau, cuja linha e coluna sero submetidas a um algoritmo de troca, que ir gerar um novo tableau. O algoritmo terminar sua execuo quando determinar que o problema no possui soluo, ou quando o problema tem soluo tima.

    SILVA et al.: AN EFFICIENT PARALLEL IMPLEMENTATION 565

  • Ao analisarmos o problema de programao linear numa ptica geomtrica, ele representado geometricamente atravs de um poltopo pertencente a ! (vide Fig. 1), formado pela interseco de vrios semi-espaos, que no caso so gerados a partir das restries cujo problema de programao linear descreve, de dimenso n. O poltopo obtido descreve a regio permissvel do problema, ou seja, a regio onde a soluo do problema se encontra. Todo o espao fora do poltopo caracteriza a regio no permissvel do problema.

    O mtodo simplex iniciado a partir da soluo trivial do problema, caracterizando um dos vrtices desse poltopo. No decorrer do algoritmo, os valores obtidos para as variveis descrevem um novo vrtice deste poltopo, vizinho do vrtice anterior. O algoritmo se baseia no fato de que, se existe uma soluo tima e nica para o problema, esta soluo se encontra em um dos vrtices desse poltopo.

    Figura. 1. Poltopo que descreve a regio permissvel. Fonte: [9].

    A. Mtodo Simplex - Alterao Algortmica A alterao algortmica realizada no mtodo Simplex

    tradicional consiste num algoritmo de duas fases, sendo ambas as fases do algoritmo submetidas a algoritmo de troca utilizado a fim de obter uma nova soluo vlida [10].

    O algoritmo de primeira fase consiste na adaptao dos valores gerando uma nova soluo parcial para o problema. Nessa etapa pode se chegar a concluso que uma soluo permissvel no existe para o problema.

    No algoritmo de segunda etapa pode se concluir que a regio permissvel descrita no problema ilimitada, portanto, possuindo infinitas solues.

    Analogamente ao mtodo tradicional do mtodo simplex, uma etapa de troca de variveis no tableau tambm realizada. Essa etapa caracteriza a obteno de valores para as variveis do problema, resultando num novo vrtice adjacente ao anterior.

    Para iniciar o algoritmo necessrio transformar a funo objetivo num problema de minimizao, caso necessrio, e normalizar as restries numa forma cannica, adicionando variveis de folga e isolando os termos livres. Somente aps essa etapa de normalizao o tableau poder ser construdo.

    A seguir, um exemplo de um problema de otimizao, seguido pela sua forma normalizada e a montagem do tableau.

    MIN! = 6!! + 12!! 0.6!! + !! 600,

    !! + !! 300, !! 100,

    !! 0 !"#$ ! = 1, , !# 5

    Forma normalizada:

    !.! 0 6!! 12!! !! = 600 0.6!! + !! , !! = 300 !! + !! ,

    !! = 100 !! # 6

    A Tabela I mostra o tableau para o desenvolvimento do algoritmo.

    TABELA I. TABLEAU DO SIMPLEX MODIFICADO

    Variveis no bsicas

    (VNB) Variveis bsicas (VB)

    Membro Livre (ML)

    !! !!

    !(!) 0 -6 -12

    !! 600 0,6 1

    !! -300 -1 -1

    !! -100 0 -1

    O algoritmo de primeira etapa [10]: 1) Na tabela padronizada procuramos uma varivel bsica

    com membro livre negativo. a) Se essa varivel existe, ento passamos para a

    operao 2 do presente algoritmo. b) Se essa varivel no existe, ento passamos para a

    segunda etapa da soluo do problema de programao linear.

    2) Na linha que corresponde varivel com membro livre negativo, procuramos o elemento negativo. a) Se o elemento negativo existe, ento a coluna,

    onde est esse elemento, escolhida como permissvel.

    b) Se o elemento negativo no existe, ento a soluo permissvel no existe.

    3) Buscar o elemento permissvel a partir da identificao do menor quociente entre os membros livres que representam as variveis bsicas (VB).

    4) Executar o algoritmo de troca. O algoritmo de troca [10]: 1) Calcular o inverso do elemento permissvel (EP). 2) Multiplicar toda a linha do EP pelo EP inverso. 3) Multiplicar toda a linha do EP pelo - (EP inverso). 4) Marcar todas as subclulas superiores (SCS) da linha

    permissvel e todas as subclulas inferiores (SCI) da coluna permissvel.

    5) Nas (SCI) vazias, multiplicar a (SCS) marcada em sua respectiva coluna com a (SCI) marcada de sua respectiva linha.

    6) Reescreva a tabela trocando de posio a varivel no bsica com a varivel bsica, ambas definidas como permissveis na tabela anterior.

    566 IEEE LATIN AMERICA TRANSACTIONS, VOL. 16, NO. 2, FEB. 2018

  • 7) Todas as (SCI) da Linha e Coluna Permitida da tabela original devero ser copiadas para suas respectivas (SCS) da nova tabela.

    8) Somar as (SCI) com as (SCS) das demais clulas restantes da tabela original e seu resultado dever ser copiado para sua respectiva (SCS) da nova tabela.

    9) Retornar para o algoritmo de primeira etapa. O algoritmo de segunda etapa [10]: 1) Na linha F(x) procuramos um elemento positivo (no

    consideramos o membro livre). a) Se o elemento positivo existe, ento passamos para

    a operao 2 do presente algoritmo. b) Se o elemento positivo no existe, ento a soluo

    tima obtida. 2) Na coluna permitida, correspondente ao elemento

    positivo escolhido, procuramos o elemento positivo fora da linha F(x). a) Se o elemento positivo existe, ento passamos para

    a operao 3 do presente algoritmo. b) Se o elemento positivo no existe, ento a soluo

    tima no existe, ou seja, a soluo ilimitada. 3) Buscar o menor quociente por meio do resultado da

    busca de mnimo da razo entre o membro livre e seu respectivo elemento da coluna permitida. O termo livre e o elemento da coluna permissvel devem ter os mesmos sinais.

    4) Executar o algoritmo de troca. O algoritmo executado de forma cclica at que se

    encontre uma das seguintes situaes terminais; o problema no tem soluo, o problema tem infinitas solues, ou o problema tem soluo tima.

    III. TRABALHOS RELACIONADOS Todos os trabalhos relacionados ao uso de GPU em

    algoritmos de otimizao foram realizados com o propsito de encontrar qual o algoritmo produz o melhor comportamento e o melhor desempenho ao ser implementado de forma paralela. Um dos primeiros artigos encontrados durante a reviso bibliogrfica, a tratar sobre melhorias de desempenho sobre manipulao de matrizes utilizando GPUs foi em [11], implementando dois kernels, um solucionador baseado em gradientes conjugados com matrizes esparsas e outro utilizando multigrid, visando beneficiar aplicaes que utilizam estas operaes em mecnica de fludos e slidos.

    OLeary e Jung propuseram em [12], a resoluo de problemas de programao linear utilizando o mtodo de pontos interiores. Sua implementao consistia na utilizao de computao heterognea, fazendo uso tanto da CPU quanto da GPU por meio da API CUDA. Nesse caso, o poder computacional da GPU foi utilizado para operaes feitas entre matrizes e fatorao de Cholesky. Diferentemente do mtodo simplex, que parte inicialmente da soluo trivial para o sistema linear, o mtodo de pontos interiores inicia sua busca a partir de pontos internos da regio permissvel. Em [12], ao comparar a verso implementada sequencialmente em CPU com a soluo implementada usando CPU-GPU, foi conseguido um aumento sensvel de desempenho para problemas de at 512 variveis. No entanto, suas comparaes de desempenho com problemas do repositrio NETLIB ([13]) no registraram ganhos de desempenho, sugerindo que os

    problemas no eram grandes o suficiente para que um ganho de desempenho seja percebido.

    Em [14], Spampinato e Elster implementaram a verso revisada do mtodo simplex para problemas de programao linear em GPU. A implementao fez uso das bibliotecas NVIDIA CUBLAS [15] e NVIDIA LAPACK [16]. Tais bibliotecas foram implementadas para acelerar a utilizao de GPU em operaes de lgebra linear na forma mais eficiente possvel. Trabalhando com cargas de trabalho geradas de forma aleatria, com at 2000 variveis e 2000 restries, foi possvel registrar speedups entre 2 e 2.5, ao se comparar com a verso sequencial em CPU do mesmo algoritmo.

    Em [4], os autores Bieling, Peschlow e Martini apresentaram uma nova implementao do mtodo simplex, em sua verso revisada. Esta nova implementao obteve um ganho mximo de 18x em relao ao solucionador de problemas de programao linear GNU Linear Programming Kit (GLPK) ([17]), em um ambiente de preciso single-precision.

    Ainda no campo da computao utilizando GPUs, em [5] foi utilizada a tecnologia OpenCL ([18]), que se trata de uma plataforma de computao heterognea, para se obter aproximadamente 28.9x de speedup na implementao do Simplex Dual em comparao do Simplex tradicional em CPU para matrizes de at 8192 variveis.

    Em [3]. Lalami, Boyer e El-Baz, realizaram uma implementao do mtodo simplex, em sua forma tradicional. Apesar de constatarem que o mtodo simplex revisado geralmente possui um desempenho melhor que a verso tradicional, para problemas densos de larga escala seus desempenhos so semelhantes. O principal objetivo do trabalho foi implementar o mtodo simplex num ambiente de preciso double-precision, e sem utilizar as bibliotecas da NVIDIA CUBLAS e LAPACK, no intuito de se obter desempenho superior. Utilizando uma carga de trabalho, gerada de forma aleatria, de problemas de programao linear densos, foi possvel atingir um speedup de 12.5 numa placa de vdeo GTX 260 da NVIDIA. Estes mesmos autores, reutilizaram a implementao supracitada num ambiente com mltiplas GPUs, conforme demonstrado em [19], conseguindo um ganho de at 24x de speedup usando duas placas de vdeo Tesla C2050. Concorrentemente, outra implementao, tambm com mltiplas GPUs, do algoritmo tradicional foi citada em [20], porm, fazendo uso das bibliotecas CUBLAS para desempenho e apresentou resultados semelhantes.

    Em [21], foi realizada uma implementao utilizando o mtodo de Branch-and-Bound (B&B) para otimizao de problemas lineares. O trabalho implementou uma abordagem hbrida, utilizando processamento em CPU e GPU durante o processamento do algoritmo, gerenciando a rvore do algoritmo B&B na CPU e a maior parte do mtodo Simplex na GPU usando a biblioteca CUBLAS. Neste trabalho foi percebido que os ganhos usando a tcnica apresentada somente eram percebidos em problemas suficientemente grandes e densos. Ao comparar o desempenho com o solucionador Coin-or Linear Programming (CLP) [7], problemas esparsos obtinham melhor desempenho sobre a abordagem usando B&B e GPU.

    SILVA et al.: AN EFFICIENT PARALLEL IMPLEMENTATION 567

  • IV. IMPLEMENTAO DO SIMPLEX MODIFICADO EM GPU-CUDA

    Nesta seo apresentam-se os detalhes da implementao paralela, utilizando GPU - CUDA, e os pontos de interesse que garantiram o bom desempenho do algoritmo.

    Embasado nos trabalhos relacionados, e diante do mtodo tradicional, foi identificado que a melhor forma de paralelizar o mtodo seria atravs de uma implementao hbrida, utilizando tanto recursos de CPU quanto de GPU, sendo estes recursos aplicados nos pontos onde realmente demonstram melhores desempenhos.

    O mtodo simplex utilizado semelhante em termos de separao em duas fases e determinao do elemento permissvel, porm o mecanismo de pivoteamento (algoritmo de troca) e a utilizao do tableau possuem mudanas em sua tcnica. Em linhas gerais, o algoritmo gira em torno de duas operaes bsicas:

    Determinar o elemento permissvel. Realizar o algoritmo de troca. O tableau descrito no mtodo utiliza uma matriz cujas

    clulas so subdividas. No mecanismo paralelo criado, foram utilizadas duas matrizes, uma para representar as subclulas superiores (varivel matrizSuperior) e outra para representar as subclulas inferiores (varivel matrizInferior).

    Antes do incio do algoritmo de primeira etapa, o sistema aloca e copia a matriz superior do tableau no dispositivo (GPU). importante notar que, a matriz inferior do tableau s possui valores vlidos durante o algoritmo de troca, quando so realizadas operaes utilizando a coluna e linha permissveis a fim de descobrir os novos valores da matriz superior. Dito isto, no necessrio alocar uma nova matriz para armazenar os valores das clulas inferiores, mas apenas clonar os valores dos vetores que descrevem os valores da linha e coluna permissveis que so utilizados nos clculos das demais clulas. Este um fator fundamental no desempenho do algoritmo, tanto sequencial quanto paralelo utilizando CUDA, visto que uma matriz reduzida gera economia de memria e, portanto, uma reduo na quantidade de dados a serem transferidos entre o host e device, e vice-versa. Alm disso, a matriz reduzida acarreta na economia de tempo de trabalho realizado por cada thread do algoritmo paralelo em GPU.

    Determinar o elemento permissvel implica em descobrir sua linha e coluna permissveis na matriz. Os algoritmos de primeira e segunda etapas descrevem como identificar esses ndices permissveis de maneira muito similar, sendo percorridas linha e coluna da matriz em busca de um determinado elemento de valor negativo e positivo respectivamente. A princpio, foi cogitada a utilizao da tcnica de reduce em GPU para otimizar essas etapas de busca de elementos. Porm, o algoritmo exige que se retorne o primeiro elemento negativo ou positivo da matriz, dependendo da etapa, ou seja, a tcnica de reduce deveria ser aplicada de forma diferenciada para o correto funcionamento do algoritmo. Tomando a fase um do algoritmo de primeira etapa como exemplo, onde necessrio percorrer, no pior caso, as m linhas da coluna de membros livres em busca de um elemento negativo, a tcnica de reduce deveria ser aplicada sobre um vetor de ndices de valores negativos da coluna de membros livres, para enfim determinar qual o menor entre eles. Seria

    necessrio inicialmente descobrir todos os ndices cujos valores so negativos, o que acarretaria num custo computacional equivalente a uma busca direta utilizando CPU. Portanto, as fases de busca por elementos de especfico valor foram implementadas em CPU, embasado nos resultados de [3].

    Ainda na fase de determinao do elemento permissvel, para determinar a linha permissvel necessrio calcular o menor quociente entre a coluna permissvel encontrada e os elementos da coluna de membros livres. Nesta fase foi possvel aplicar o paralelismo em GPU, tendo em vista a aplicao da tcnica de map para processar a diviso entre dois vetores de m elementos, a coluna permitida e a coluna de membros livres. O Algoritmo 1 foi desenvolvido para retornar o vetor de quocientes:

    Figura. 2. Pseudocdigo para clculo dos quocientes. Fonte: Do prprio autor.

    O vetor de quocientes resultante dessa operao copiado para o host, onde feita uma busca pelo primeiro menor valor positivo de forma sequencial em CPU. Ao final deste processo, obtemos os ndices que descrevem a localizao do elemento permissvel na matriz.

    De posse do elemento permissvel, o algoritmo inicia sua fase de atualizao do tableau, utilizando o algoritmo de troca. Inicialmente, o algoritmo havia sido implementado realizando alocao das clulas superiores e inferiores, o que gerava uma matriz com o dobro de tamanho do problema original, o que verificado tambm nas implementaes tradicionais do mtodo Simplex, levando em considerao que os vetores que descrevem as variveis bsicas tambm esto presentes no tableau. Porm, conforme dito anteriormente, os valores das clulas inferiores so apenas memria de clculo para facilitar a abordagem didtica deste algoritmo, portanto, foi realizada uma alterao no procedimento visando tanto o melhor desempenho do algoritmo, quanto uma economia de memria considervel. Inicialmente necessrio fazer a cpia dos vetores que descrevem os elementos da linha e coluna permissveis. O Algoritmo 2 descreve esse comportamento:

    568 IEEE LATIN AMERICA TRANSACTIONS, VOL. 16, NO. 2, FEB. 2018

  • Figura. 3. Pseudocdigo para cpia das linhas e colunas permissveis. Fonte: Do prprio autor.

    Aps a cpia dos elementos da linha e coluna permissveis, possvel concluir a fase do algoritmo de troca, que se trata da atualizao de todos os elementos da matriz. O Algoritmo 3 foi criado para computar os valores (vide o tpico descritivo do mecanismo de pivoteamento):

    Figura. 4. Pseudocdigo que realiza o algoritmo de troca. Fonte: Do prprio autor.

    Ao final, a matriz superior que estava alocada na GPU/device copiada para a matriz superior no host, terminando a iterao. O algoritmo ento reiniciado a partir da primeira etapa.

    V. BIBLIOTECA CUDA-SIMPLEX Um objetivo secundrio deste trabalho a criao de uma

    biblioteca para a resoluo de problemas de programao

    linear, portanto, descreveremos brevemente, de forma tcnica, a arquitetura e a utilizao da mesma.

    Para atingir esse objetivo foi necessrio: Criao de estrutura de dados que represente de forma

    clara o problema de programao linear. Utilizando recursos de orientao a objeto do C++, foram criadas as seguintes classes: Variavel: Classe responsvel por armazenar o nome e o valor de coeficiente de uma varivel. Restricao: Classe responsvel por representar uma restrio do problema de programao linear, armazenando um conjunto de variveis indexadas pelo respectivo nome, valor da constante do termo livre, sinal de desigualdade e uma varivel bsica que ser utilizada para transformar a desigualdade da restrio em uma igualdade (forma cannica). FObjetivo: Classe que representa a funo objetivo do problema de programao linear, e encapsula todas as operaes necessrias para descrev-la. Armazena todas as variveis do problema, restries, variveis bsicas criadas na fase de normalizao, e um indicador de direo da otimizao (maximizar/ minimizar).

    Fornecer funes para gerenciar a criao do problema de otimizao. Foram criadas as seguintes funes: addVariavel (Nome, Coeficiente): Funo que adiciona uma varivel na funo objetivo. addRestricao (Nome): Funo que adiciona uma restrio no problema de otimizao. addVariavelRestricao (NomeRestricao, NomeVariavel, Coeficiente): Funo que adiciona uma varivel a uma restrio existente no problema. setDesigualdadeRestricao (NomeRestricao, Desigualdade): Funo que determina o valor de desigualdade de uma restrio, atravs das constantes Maior, Menor, MaiorOuIgual, MenorOuIgual, Igual. setTermoLivreRestricao (NomeRestricao, TermoLivre): Funo que seta o valor da constante (termo livre) de uma restrio existente no problema.

    Por fim, a criao de um controlador responsvel por receber um problema de otimizao e resolv-lo. Para isso, foi criada uma classe chamada SimplexSolver, que recebe uma instncia de FObjetivo. Ao invocar a funo Simplex- Solver::otimizar(), o controlador ir realizar as operaes de normalizao do problema (forma cannica), e iniciar as etapas do mtodo Simplex.

    Utilizando o paradigma criado, possvel descrever a seguinte funo objetivo,

    MIN! = 6!! + 12!! 0.6!! + !! 600,

    !! + !! 300, !! 100, !! 0 !"#$ ! = 1, , !# 7

    conforme mostrado na Fig.5:

    SILVA et al.: AN EFFICIENT PARALLEL IMPLEMENTATION 569

  • Figura. 5. Exemplo de cdigo para criao de uma funo objetivo. Fonte: Do prprio autor.

    A primeira restrio do problema pode ser configurada conforme mostrado na Fig.6:

    Figura. 6. Exemplo de cdigo para criao de restries de uma funo objetivo. Fonte: Do prprio autor.

    Por fim, aps a descrio do problema de programao linear, caber apenas indicar ao controlador a funo que ser resolvida e invocar a funo SimplexSolver::otimizar().

    Figura. 7. Exemplo de cdigo para resoluo de uma funo objetivo usando o SimplexSolver. Fonte: Do prprio autor.

    Para testar as implementaes desenvolvidas, foram

    utilizados problemas gerados aleatoriamente. O gerador de problemas desenvolvido permite a parametrizao quanto quantidade de variveis, restries e a densidade da matriz a ser produzida. Os problemas gerados eram escritos em arquivos no formato Mathematical Programming System (MPS - vide [22]). Esse formato permite a reutilizao dos problemas gerados em outros solvers para atestar a assertividade dos resultados obtidos.

    VI. RESULTADOS Os testes foram realizados num computador com as

    seguintes configuraes: CPU: AMD A8-3500M 1.50GHz (Quad Core) GPU: NVidia Geforce GT 650M 1024 MB GDDR5 -

    900MHz - 384 CUDA Cores RAM: 8 GB DD4 2133 MHz

    Tendo em vista que o mtodo Simplex soluciona os

    problemas de programao linear em uma quantidade determinada de iteraes, no h relao direta entre o tamanho da matriz, que gera o tableau, e a quantidade de iteraes utilizadas para resolver o problema. Caso a soluo tima do problema esteja prxima ao ponto de origem (ponto de partida do algoritmo), bastam poucas iteraes para encontrar sua soluo. O grau de densidade da matriz est diretamente ligado ao tempo de resoluo do problema, pois a

    quantidade de vrtices a serem analisados numa matriz densa superior ao de uma matriz de mesma dimenso, porm esparsa. Sendo assim, para medir com fidelidade o desempenho do algoritmo, em ambas as implementaes, foi medido o tempo, em segundos, que um algoritmo demora para concluir uma iterao do algoritmo. Entende-se por "uma iterao", o tempo compreendido entre o incio do algoritmo at a execuo do algoritmo de troca, e assim sucessivamente. O tempo de cpia dos dados entre a memria host e a memria do device est includo no tempo total medido por iterao do algoritmo. importante salientar que essa operao, de transferncia de dados entre host e device ocorre a cada finalizao do algoritmo de troca, atualizando a matriz do problema na memria do host, reiniciando os passos do algoritmo com a matriz atualizada.

    Quanto aos aspectos metodolgicos da coleta de dados, cada problema foi submetido a uma bateria de 3 testes consecutivos, e ao final de cada bateria a mdia aritmtica de tempo por iterao do problema era calculada. importante salientar que este trabalho no se preocupou em realizar ajustes finos nas execues do algoritmo em GPU-CUDA. Tais ajustes podem, e devem trazer ganhos ainda maiores no que diz respeito ao desempenho do algoritmo.

    A seguir seguem os grficos obtidos durante as medies de desempenho, seguidos das suas respectivas anlises.

    A Fig. 8 apresenta o desempenho de uma implementao tradicional do mtodo Simplex, implementado de forma sequencial em CPU e outra implementao paralela em GPU CUDA.

    Figura. 8. Desempenho do algoritmo tradicional, medido em escala logartmica de segundos / iterao, dos problemas gerados com valores aleatrios. Fonte: Do prprio autor.

    O speedup alcanado nesta implementao foi de aproximadamente 4,1x. Nota-se que, mesmo a implementao em paralelo utilizando GPU, o grfico apontou uma curva acentuada a medida que o problema de programao linear tem suas dimenses aumentadas, ou seja, a implementao paralela no trouxe um ganho exponencial conforme esperado em relao implementao sequencial.

    Na Fig. 9 mostra-se o comparativo de desempenho de duas implementaes da verso modificada, descrita neste trabalho, do mtodo Simplex.

    0.001

    0.010

    0.100

    1.000

    10.000

    Dimenso

    Tempo

    (s)

    CPU GPU

    570 IEEE LATIN AMERICA TRANSACTIONS, VOL. 16, NO. 2, FEB. 2018

  • Figura. 9. Desempenho do algoritmo modificado, medido em escala logartmica de segundos / iterao, dos problemas gerados com valores aleatrios. Fonte: Do prprio autor.

    Diferentemente da implementao anterior, a implementao paralela obteve resultados mais significativos mesmo para problemas com dimenses elevadas, alcanando aproximadamente 9,6x de speedup em relao a implementao sequencial. muito importante notar que o ganho apresentado neste grfico nos mostra, alm de um ganho superior ao algoritmo tradicional, que a implementao do algoritmo modificado nos trouxe escalabilidade em termos de paralelismo do mtodo Simplex. Tal comportamento no encontrado na implementao tradicional.

    A Fig. 10 nos mostra a comparao entre as implementaes do algoritmo sequencial tradicional versus a implementao paralela utilizando CUDA do algoritmo modificado.

    Figura. 10. Desempenho do algoritmo tradicional (CPU) versus algoritmo modificado (GPU), medido em escala logartmica de segundos/iterao, dos problemas gerados com valores aleatrios. Fonte: Do prprio autor.

    Nesta anlise observamos um speedup de aproximadamente 15,6x entre as implementaes do algoritmo. Este tipo de comparao a mais comum nos trabalhos deste tipo, pois mostra o ganho final total entre uma implementao no

    otimizada e sequencial em relao a outra implementao otimizada e paralela do algoritmo.

    A Fig. 11 nos mostra a relao dos speedups produzidos na comparao mostrada na Fig. 10, indicando uma tendncia de aumento do speedup medida que a dimenso do problema aumenta.

    Figura. 11. Speedup alcanado do algoritmo tradicional (CPU) versus algoritmo modificado (GPU) medido de forma geral (tempo de kernel mais tempo de transferncia de dados) e medindo apenas o tempo total de kernel da GPU. Fonte: Do prprio autor.

    Ainda na Fig. 11, so exibidas duas sries, uma mostrando o speedup alcanado utilizando o tempo total do algoritmo em paralelo (tempo de kernel mais tempo de transferncia de dados), e outra srie mostra o speedup calculado ao se utilizar apenas o tempo total de processamento dos kernels do cdigo paralelo em GPU. Utilizando apenas o tempo de kernel como referncia, desprezando o tempo de transferncia dos dados da matriz entre host e device, foi possvel obter um speedup de 22,3x para uma matriz quadrada de ordem 5000 (5000 variveis por 5000 restries).

    Figura. 12. Desempenho do algoritmo tradicional (GPU) versus algoritmo modificado (GPU), medido em escala logartmica de segundos/iterao, dos problemas gerados com valores aleatrios. Fonte: Do prprio autor.

    A Fig. 12 mostra um comparativo entre os desempenhos das implementaes paralelas utilizando CUDA dos algoritmos tradicional e modificado. O algoritmo modificado apresentou um ganho de desempenho cerca de 3,8x superior

    0.000

    0.001

    0.010

    0.100

    1.000

    Dimenso

    Tempo

    (s)

    CPU GPU

    0.000

    0.001

    0.010

    0.100

    1.000

    10.000

    Dimenso

    Tempo

    (s)

    CPU GPU

    0

    5

    10

    15

    20

    25

    Speedu

    p

    Dimenso

    SpeedUp(Kernel) SpeedUp(Geral)

    0.000

    0.001

    0.010

    0.100

    1.000

    Dimenso

    Tempo

    (s)

    GPU(Trad) GPU(Mod)

    SILVA et al.: AN EFFICIENT PARALLEL IMPLEMENTATION 571

  • ao algoritmo tradicional, demonstrando que a modificao do simplex apresentada neste trabalho possui um desempenho definitivamente superior implementao tradicional do algoritmo. Mostrando que a modificao algortmica proposta, alm de produzir ganhos significativos em relao implementao sequencial, tambm possui melhor desempenho ao ser paralelizada.

    Considerao os resultados obtidos nos experimentos realizados, podemos estimar o ganho de performance para cada dimenso do problema. Alguns dos problemas no chegaram at seus resultados finais mesmo aps dezenas de milhares de iteraes, portanto iremos estimar um tempo de execuo relativo 50 mil iteraes do algoritmo, conforme mostrado na Tabela II.

    TABELA II. ESTIMATIVA DE TEMPO PARA ENCONTRAR A

    SOLUO TIMA

    Dimenso CPU (segundos) GPU (segundos) 1000 1586,373 211,225

    2000 5837,653 833,653 3000 18093,964 1512,476 4000 32163,231 2469,565 5000 57847,541 3699,255

    VII. CONCLUSO O mtodo simplex, com a modificao algortmica

    proposta, obteve speedups considerveis, de at 15,6x (vide Fig. 10) ao medirmos o tempo total (tempo de transferncia mais tempo de processamento de kernel), e de at 22,3x (vide Fig. 11) se considerarmos apenas o tempo de processamento total de kernel, ao utilizarmos sua implementao em GPU/CUDA em comparao com sua respectiva implementao em CPU. Este ganho de desempenho se mostrou consistente durante os testes, podendo ser superior para matrizes de dimenses ainda maiores.

    Salientamos que a modificao algortmica proposta nos trouxe melhor desempenho tanto quando comparado implementao sequencial, quanto na implementao paralela do algoritmo tradicional, ou seja, a principal contribuio deste trabalho se d na demonstrao de uma nova modificao algortmica no mtodo Simplex, que provou ser eficiente em termos de desempenho em todos os casos de implementao do mtodo, atingindo o objetivo principal proposto.

    Observando os resultados apresentados na Fig. 3, que nos mostra um speedup de 4,1x na implementao do algoritmo tradicional, e na Fig. 4, que nos mostra um speedup de 9,6x na implementao do algoritmo modificado, fica claro que, o algoritmo modificado possui um potencial maior em termos de paralelismo, levando a ganhos superiores e trazendo escalabilidade de desempenho mesmo para problemas grandes. As implementaes geradas durante a pesquisa esto disponveis em [8], podendo ser reutilizadas para fins acadmicos.

    Como possveis trabalhos futuros, podero ser realizadas melhorias no algoritmo implementado em GPU, visando um melhor aproveitamento das caractersticas de cada hardware onde a implementao executada. Essas melhorias dizem respeito configurao de grid, blocos, e quantidade de

    threads cujos kernels so submetidos. Esta melhoria pode ser feita utilizando uma estratgia de autoconfigurao do algoritmo, realizada atravs de uma etapa de reconhecimento de hardware disponvel para o processamento.

    Outras melhorias ainda podem ser realizadas no que diz respeito implementao da biblioteca, construindo um mdulo stand-alone para executar o algoritmo utilizando uma interface grfica nos moldes da implementao feita pelo prprio autor e disponvel no projeto em [8].

    REFERNCIAS [1] J. C. Nash, The (dantzig) simplex method for linear programming,

    Computing in Science and Eng., vol. 2, no. 1, pp. 2931, Jan. 2000. [Online]. Available: http://dx.doi.org/10.1109/5992.814654

    [2] G. B. Dantzig, Linear Programming and Extensions. Princeton University Press, 1963. [Online]. Available: http://books.google.com.br/books?id=2j46uCX5ZAYC

    [3] M. Lalami, V. Boyer, and D. El-Baz, Efficient implementation of the simplex method on a cpu-gpu system, in Parallel and Distributed Processing Workshops and Phd Forum (IPDPSW), 2011 IEEE International Symposium on, 2011, pp. 19992006.

    [4] J. Bieling, P. Peschlow, and P. Martini, An efficient gpu implementation of the revised simplex method, in Parallel Distributed Processing, Workshops and Phd Forum (IPDPSW), 2010 IEEE International Symposium on, 2010, pp. 18.

    [5] A. Hamzic, A. Huseinovic, and N. Nosovic, Implementation and performance analysis of the simplex algorithm adapted to run on commodity opencl enabled graphics processors, in Information, Communication and Automation Technologies (ICAT), 2011 XXIII International Symposium on, 2011, pp. 17.

    [6] F. Sullivan and J. Dongarra, Guest editors introduction: The top 10 algorithms, Computing in Science & Engineering, vol. 2, no. undefined, pp. 2223, 2000.

    [7] C. John J. Forrest, Clp (coin-or linear programming), 2014, clp (Coin-or linear programming) is an open-source linear programming solver written in C++. It is primarily meant to be used as a callable library, but a basic, stand-alone executable version is also available. [Online]. Available: https://projects.coin-or.org/Clp

    [8] V. O. e Silva, Cuda simplex. [Online]. Available: https://github.com/vinishiru/cuda-simplex

    [9] Wikipedia, Simplex algorithm, ltimo acesso: 30 de junho de 2013. [Online]. Available: http://en.wikipedia.org/wiki/Simplex_algorithm

    [10] R. P. Witold Pedrycz, Petr Ekel, Fuzzy Multicriteria Decision-Making: Models, Methods and Applications, Wiley, Ed. John Wiley & Sons, 2011. [Online]. Available: http://books.google.com.br/books?id=xjvuNd3wwmsC

    [11] J. Bolz, I. Farmer, E. Grinspun, and P. Schrder, Sparse matrix solvers on the gpu: Conjugate gradients and multigrid, in ACM SIGGRAPH 2005 Courses, ser. SIGGRAPH 05. New York, NY, USA: ACM, 2005. [Online]. Available: http://doi.acm.org/10.1145/1198555.1198781

    [12] O. Jung, Jin Hyuk and D. P., Implementing an interior point method for linear programs on a cpu-gpu system. ETNA. Electronic Transactions on Numerical Analysis [electronic only], vol. 28, pp. 174189, 2007. [Online]. Available: http://eudml.org/doc/117656

    [13] Netlib, Netlib repository. [Online]. Available: http://www.netlib.org/ [14] D. Spampinato and A. Elster, Linear optimization on modern gpus, in

    Parallel Distributed Processing, 2009. IPDPS 2009. IEEE International Symposium on, 2009, pp. 18.

    [15] C. NVIDIA, Cuda - cublas library 2.0. [Online]. Available: https://developer.nvidia.com/cublas

    [16] , Lapack library. [Online]. Available: https://developer.nvidia.com/em-photonics-cula-tools

    [17] Gnu linear programming kit (glpk). [Online]. Available: http://www.gnu.org/software/glpk/

    [18] KhronosGroup, Open computing language, ltimo acesso em: 01/02/2013. [Online]. Available: https://www.khronos.org/opencl/

    [19] M. Lalami, D. El-Baz, and V. Boyer, Multi gpu implementation of the simplex algorithm, in High Performance Computing and Communications (HPCC), 2011 IEEE 13th International Conference on, 2011, pp. 179186.

    [20] P. A. Xavier Meyer and B. Chopard, A multi-gpu implementation and performance model for the standard simplex method, submitted to the

    572 IEEE LATIN AMERICA TRANSACTIONS, VOL. 16, NO. 2, FEB. 2018

  • 17th International European Conference on Parallel and Distributed Computing, 2011.

    [21] X. Meyer, B. Chopard, and P. Albuquerque, A branch-and-bound algorithm using multiple gpu-based lp solvers, in 20th Annual International Conference on High Performance Computing, Dec 2013, pp. 129138.

    [22] The mps file format. [Online]. Available: http://lpsolve.sourceforge.net/5.5/mps-format.htm

    Vincius Oliveira e Silva received his M.Sc. degree in Electrical Engineering from Pontifical Catholic University of Minas Gerais (PUC Minas) in 2017 and his B.Sc. in Computer Science from PUC Minas in 2010. He is currently system architect and works in the

    research and development area. His research interests include parallel computing, gpu computing, high performance computing, artificial intelligence, operational research, computational intelligence, image processing and internet of things.

    Petr Ya. Ekel obtained his Ph.D. degree from the National Technical University of Ukraine Kiev Polytechnic Institute and D.Sc. (habil.) degree from the Institute of Electrodynamics of the Ukrainian Academy of Sciences. He is at present Full Professor at the Pontifical Catholic

    University of Minas Gerais, Belo Horizonte, Brazil. He is also with the Federal University of Minas Gerais. Petr Ekel has been a member of numerous program and advisory committees of international conferences in the areas of system modeling, optimization, and control and decision making. He is an editorial board member for numerous international journals, including Information Sciences, Information Fusion, Group Decision and Negotiation. His main research activities are related to Operational Research, Decision Making, and Computational Intelligence. He has published numerous papers and two research monographs related to these topics.

    Carlos Augusto Paiva da Silva Martins is currently an associate professor at the Pontifical Catholic University of Minas Gerais (PUC Minas). He received his Ph.D. degree in Electrical Engineering from the University of So Paulo

    (USP) in 1998, his M.Sc. degree in Electrical Engineering from the Federal University of Minas Gerais (UFMG) in 1994 and his B.Sc. in Electrical Engineering from the Pontifical Catholic University of Minas Gerais (PUC Minas) in 1989. His research interests include artificial life, computer architecture, computer science education, evolvable hardware, parallel computing, reconfigurable computing, remote laboratories, and unconventional computing systems.

    SILVA et al.: AN EFFICIENT PARALLEL IMPLEMENTATION 573