• Nenhum resultado encontrado

Eficiente do Algoritmo Simplex Padrão em Arquitetura Multicore

N/A
N/A
Protected

Academic year: 2023

Share "Eficiente do Algoritmo Simplex Padrão em Arquitetura Multicore"

Copied!
96
0
0

Texto

Daniel Aloise por me ajudar com a versão acadêmica do CPLEXR e pela orientação na área de otimização. Este trabalho apresenta uma implementação paralela escalável e eficiente do algoritmo Simplex padrão em arquitetura de processador multi-core para resolver problemas de programação linear de grande escala. Um esquema geral é apresentado explicando como cada passo do algoritmo simplex padrão é paralelizado, observando pontos importantes de implementação paralela.

A análise de escalabilidade foi realizada em problemas de diferentes dimensões, encontrando evidências de que a implementação paralela proposta do algoritmo simplex padrão tem melhor eficiência paralela para problemas com mais variáveis ​​do que restrições. Este trabalho propõe uma implementação paralela escalável e eficiente do algoritmo simplex padrão em arquitetura multicore para problemas de programação linear de grande escala. Neste contexto, este trabalho tem como objetivo apresentar uma implementação paralela do algoritmo Simplex padrão para processadores multicore, para resolver problemas de programação linear de grande escala.

Motivação e Justificativa

Objetivos

Organização do texto

Simplex

  • Forma Padrão e Canônica
  • O método Simplex
    • Equações Básicas
    • Teste de otimalidade - Entrada na Base
    • Teste da Razão - Saída da Base
    • Atualização - Obter uma nova SBV
    • O Algoritmo Simplex
  • O Simplex Tableau
    • Teste de Otimalidade
    • Teste da Razão
    • Obtenção de uma nova SBV
    • Algoritmo do Simplex Tableau
  • Simplex Revisado

Simplex é um algoritmo baseado em ferramentas de álgebra linear para determinar, através de um método iterativo, a solução ótima para um problema de programação linear. Em geral, o algoritmo parte de uma solução inicial válida do sistema de equações que constituem as restrições para o problema de PL. A seguir, será descrito o método Simplex para um problema de minimização, que é análogo ao problema de maximização, apenas com diferença no critério de otimalidade.

Considere o problema de minimização de programação linear na forma padrão apresentada em (2.25), onde o posto da matriz A é m. Caso contrário, procuramos um VNB que entre na base, diminuindo o valor da função objetivo. Porém, se dj > 0 e xj aumentar seu valor, significa que o valor de Z aumentaria, e isso não é útil para o problema de minimização e neste caso xj não é candidato a entrar na base.

O algoritmo Simplex descreve a sequência de ações que devem ser executadas para obter uma solução para um problema de PL, com base em critérios previamente definidos. Para as colunas relativas a VB, considere a matriz identidade representando a matriz base B. Tabela 2: Um Tableau Simplex inicial mais detalhado. viu-se que no problema de minimização o critério para entrada do VNB no banco de dados é que dj <0, logo para o problema de maximização esse critério seria o oposto, ou seja, dj >0. Portanto, temos para o problema no Simplex Tableau:. 2.27), ou seja, um candidato para entrada no banco de dados na forma de Tableau, −dj <0.

O VNBxk associado é escolhido para entrar na base, e a coluna que se refere a esta variável é chamada de coluna pivô. O método simplex revisado consiste em uma forma de aplicar o método a um problema de programação linear para reduzir o número de operações realizadas.

Arquiteturas Paralelas

Arquitetura de Von Neumann

  • Memória Cache

Na máquina de von Neumann, uma única instrução é executada por vez e opera apenas em certas partes dos dados. Essa separação entre CPU e memória costuma ser chamada de gargalo de Von Neumann, que consiste na diferença de clock entre a CPU e a memória. A taxa de comunicação de dados entre a CPU e a memória é muito menor do que a taxa na qual o processador pode operar.

Isto limita a velocidade efetiva de processamento, especialmente quando a CPU precisa processar grandes quantidades de dados. Os primeiros computadores eletrônicos digitais foram desenvolvidos na década de 1940, desde então cientistas e engenheiros da computação propuseram melhorias na arquitetura básica de von Neumann. Muitos deles visam reduzir o problema do gargalo de von Neumann, e outros visam simplesmente tornar as CPUs mais rápidas.

Um exemplo dessas melhorias pode ser citado: a separação dos barramentos de instrução e de dados, que permite referências de dados e instruções em paralelo, sem interferência mútua; a criação de pipeline, que é um conjunto de elementos de processamento conectados em série, onde a saída de um elemento é a entrada do próximo. A seguir será descrita uma breve explicação sobre memória cache, pois ela tem grande influência no aprimoramento da arquitetura Von Neumann, além de influenciar diretamente neste trabalho. A memória cache pode ser acessada muito mais rapidamente do que um chip de memória normal (PACHECO,2011).

Isto é, um acesso à memória que operará em blocos de dados e instruções, em vez de instruções individuais e itens de dados individuais. Quando a CPU tenta ler dados ou instruções, ocorre uma falha de leitura em todos os níveis de cache, então o bloco de dados ou instruções (linha de cache) será lido da memória principal.

Classificação de Computadores Paralelos

MISD - Instrução Múltipla, Dados Únicos4 são conceitualmente definidos como múltiplos fluxos de instruções operando nos mesmos dados. Além da dificuldade de implementação deste tipo de sistemas, falta uma plataforma ou paradigma de programação que permita utilizar este tipo de arquitetura de forma eficiente. MIMD - Multiple Instruction, Multiple Data streams5 refere-se a sistemas paralelos que possuem natureza assíncrona, ou seja, as instruções são geradas por diferentes unidades de controle e cada processador executa suas instruções sobre seus próprios dados.

Arquiteturas de memória em Computadores Paralelos

  • Memória Compartilhada
  • Memória Distribuída

A memória principal da máquina é compartilhada por todos os processadores através de um único barramento que os conecta, portanto essa comunicação com a memória é nativa. Um dos gargalos desse sistema é que o acesso à memória principal é feito através de um único barramento, e esse acesso é serial. NUMA (acesso não uniforme à memória) é um sistema de memória compartilhada onde cada nó desse sistema possui sua própria memória local que pode ser acessada por todos os outros processadores nele.

O custo de acesso à memória local é inferior ao custo de acesso aos dados presentes na memória local de outros processadores, avaliado em termos de tempo de acesso e latência. No entanto, alguns blocos de memória podem estar fisicamente mais próximos de determinados processadores e naturalmente associados a eles. Um sistema de memória distribuída é um sistema composto por vários computadores, capazes de operar de forma completamente desconectada e se comunicar através de operações de entrada e saída (CULLER; GUPTA; SINGH, 1997).

Esses sistemas geralmente consistem em diversas unidades de processamento conectadas por uma rede de dados, onde cada processador possui apenas uma área de memória local. As unidades de processamento podem funcionar independentemente umas das outras e se precisarem acessar endereços de memória não locais, esses dados geralmente são transferidos pela rede de uma área de memória para outra. 6 Latência de memória é o tempo que um processador espera que os dados solicitados que não estão em sua memória local fiquem disponíveis.

Dependendo da topologia e da tecnologia utilizada para interligar os processadores, a velocidade de comunicação pode ser tão alta quanto em uma arquitetura de memória compartilhada. Cada computador possui sua própria memória principal, que forma uma hierarquia de memória distribuída.

Máquinas Paralelas

  • CM-2 (Connection Machine-2)
  • MP (MasPar)
  • Cray T3D
  • Multicore
  • Multi-Computadores/Processadores

Se um processador precisar de informações que estão na memória principal de outra unidade de processador, essas informações deverão ser passadas explicitamente entre os processadores usando um mecanismo de Message Passing7. Seus processadores estão organizados em um hipercubo, onde cada vértice corresponde ao que se chama de nó sprint, que consiste em 32 processadores não poderosos (1 bit). Assim, por exemplo, usando uma malha com 65.536 processadores, existem 2.048 nós de sprint organizados em um hipercubo de 11 dimensões.

Um processador multicore é um componente de computador com duas ou mais unidades de processamento independentes chamadas núcleos. A arquitetura geralmente é uma SMP, ou seja, onde dois ou mais processadores idênticos são conectados a uma única memória principal, implementada em um circuito VLSI – Very Large Scale Integration8. Com processadores multi-core, o sistema operacional trata cada um desses núcleos como um processador diferente.

8 VLSI é o processo de criação de circuitos integrados combinando milhares de transistores em um único chip. Adicionar novos núcleos de processamento a um processador permite que as instruções do aplicativo sejam executadas em paralelo, como se fossem dois ou mais processadores diferentes. Dois ou mais núcleos não agregam capacidade de processamento, mas dividem as tarefas entre si.

Por exemplo, um processador dual-core com velocidade de clock de 1,8 Ghz não é equivalente a um processador single-core com velocidade de clock de 3,6 Ghz, mas sim com dois núcleos de 1,8 Ghz trabalhando em paralelo. O multiprocessador é uma série de unidades de processamento que utilizam memória compartilhada; Multicomputador é um sistema distribuído, ou seja, dois ou mais computadores interligados, comunicando-se através de uma mensagem em que cada computador pode realizar uma tarefa diferente.

Software Paralelo

  • MPI

Isso ocorre porque à medida que o tamanho do problema é fixo e o número de processadores aumenta, há uma redução na quantidade de trabalho por processador. Suponha um programa paralelo com tamanho do problema e número de processos/threads fixos, obtendo assim uma eficiência E. Suponha, agora, um programa paralelo com tamanho do problema e número de processos/threads fixos, obtendo assim uma eficiência E .

Reconheça também que tanto o número de processos/threads usados ​​pelo programa quanto o tamanho do problema estão aumentando. Em 2009, Yarmish e Slyke (2009) apresentaram uma implementação distribuída do padrão Simplex para problemas de programação linear de grande escala. Deve-se notar que o número de linhas de um problema refere-se ao número de restrições e o número de colunas refere-se ao número de variáveis.

A Figura 23 mostra o tempo sequencial do método Simplex padrão em forma tabular e o algoritmo CPLEXR Simplex com número fixo de variáveis ​​e número variável de restrições. O número de iterações do algoritmo Simplex padrão teve que ser limitado a 5.000 devido ao longo tempo gasto para encontrar a solução para grandes problemas. A Figura 24 mostra o tempo sequencial para o algoritmo Simplex padrão e o algoritmo CPLEXR Simplex com o número fixo de restrições, variando o número de variáveis.

Entretanto, nossa implementação paralela do algoritmo Standard Simplex obteve melhor desempenho em comparação ao CPLEXR. O CPLEXR teve melhor desempenho para todos os problemas, principalmente devido ao número de iterações ser bem menor que o Standard Simplex sequencial. Para os gráficos de eficiência do algoritmo paralelo em relação ao Simplex Padrão com 8, 16 e 24 threads, porém, quando o tamanho em bytes do problema se torna maior que a capacidade do cache (V ariáveis×Restrições×8B ≤12M B), .

Isso indica que o tempo sequencial do Standard Simplex foi maior para todos esses tipos de problemas.

Referências

Documentos relacionados

Nome do contato: Telefone c/ DDD: Fax c/ DDD: E-mail: JUSTIFICATIVA Obrigatório preencher CONTEÚDO DO PROGRAMA Obrigatório anexar folder programa caso solicite pagamento de