• Nenhum resultado encontrado

FALTA uma FIGURA aqu

TÉCNICAS DE PROCESSAMENTO PARALELO UTILIZADAS

Aumentar o clock do processador era uma técnica utilizada para elevar a quantidade de processamento em um determinado espaço de tempo. Porém, esta técnica alcançou um patamar onde o custo do resfriamento do processador tornou-se financeiramente inviável (BENINI, 2005). Outra limitação dos processadores de apenas um núcleo (singlecore) é a grande diferença entre a velocidade da memória e a do processador, aliada à estreita banda de dados, que faz com que aproximadamente 75 % do uso do microprocessador seja gasto na espera por resultados dos acessos à memória (Nikolas Aschermann, 2007).

Na maioria dos processadores de mais de um núcleo, cada núcleo pode possuir uma memória cache própria e, em alguns casos, realizam acesso direto e independente à memória principal, permitindo que cada processador realize os cálculos para os quais foi requisitado, concorrentemente com o outro processador, elevando, desta maneira, o desempenho global do sistema. No entanto, o bom aproveitamento dos vários núcleos em processadores que possuem vários núcleos (multi-core processors), depende do modo com que o software aplicativo foi projetado e implementado (Foster, 2009).

Processadores “multi-core” possuem um bom desempenho, performance, disponibilidade e segurança a um menor custo (ALVES, 2007). Por outro lado, esta tecnologia possui algumas desvantagens, porque aumenta a utilização dos recursos de hardware e depende dos recursos disponíveis tanto do sistema operacional de apoio quanto do software aplicativo, pois a capacidade dos processadores multi-core depende

da utilização de vários segmentos dentro das aplicações para aumentar o desempenho da aplicação (FREITAS, 2006).

Os AGs são algoritmos usados em várias aplicações com o intuito de aperfeiçoar parâmetros, no entanto, o processo de melhoramento da solução é normalmente lento e exige elevado esforço computacional. Dependendo da complexidade do problema, uma solução considerada boa pode demorar dias, semanas ou até meses (Celso Camilo, 2007).

Por isso, neste trabalho, os operadores genéticos, isto é, o operador mutação, cruzamento, seleção, dentre outros, são executados em paralelo desde que o processador seja “multi-core” e o sistema operacional possibilite a utilização dos núcleos.

Neste sentido, este capítulo apresenta às técnicas utilizadas para que o algoritmo de identificação de sistema proposto execute os operadores genéticos em paralelo, visando aproveitar toda capacidade computacional disponível no processo de solução da identificação do sistema.

B.1 - ESCOLHA DA LINGUAGEM DE PROGRAMAÇÃO

Para que fosse possível executar os operadores genéticos em paralelo, o primeiro desafio foi determinar a linguagem de programação que seria utilizada para programar o algoritmo de identificação de sistemas proposto.

Os critérios adotados para a escolha da linguagem de programação foram: • Combinar características de linguagens de alto e baixo níveis;

• Possuir compilador freeware para PC e microcontroladores; • Ser uma linguagem de programação multi-paradigma;

Com o objetivo de atender todos os critérios adotados, optou-se em utilizar o framework multiplataforma para desenvolvimento em C++, denominado Qt.

Optou-se pelo SDK Qt por ele ser um pacote multiplataforma, intuitivo e eficiente, ou seja, além de ser portável para vários sistemas operacionais, inclusive plataformas embarcadas, o código é sempre recompilado para a plataforma de trabalho, de forma a otimizar o código gerado, ao contrario de alguns que utilizam-se de maquinas virtuais e ou interpretadores para realiza esta compatibilidade com as plataformas.

Outro ponto é a grande variabilidade de ferramentas e módulos prontos, disponíveis neste pacote, que facilitam na codificação do sistema.

O Qt foi, originalmente, criado pela Trolltech, mas a Nokia adquiriu a Trolltech em 2008 e licenciou o QT sob a licença LGPL em 2009, o que eliminou as barreiras comerciais de licenciamento, e que impedia a adoção em larga escala do toolkit. Entre as empresas da atualidade que utilizam o Qt estão: Google, Amazon, Skype, Adobe e MathWorks (Qt.Nokia, 2012).

Além disso, ele possui vários recursos para o desenvolvimento de aplicativos que necessitam de processamento paralelo e facilita o desenvolvimento de aplicativos que necessitam ser executados em clusters, isto é, um aglomerado de computadores ligados em rede e que operam como se fossem uma única máquina de grande porte.

B.2 - A CLASSE MULTI-TRHEAD DESTRUCT DO QT

O SDK (Software Development Kit), conhecido como Qt, possui uma serie de recursos que facilitam a implementação de um sistema multitarefa (Qt.Nokia, 2012).

A classe QThread é um desses recursos cuja função é criar threads independentes. Cada thread fornece controle independente dentro do programa e pode

compartilhar dados com outras threads dentro do processo, porém, cada threads é executada separadamente como se fosse um programa separado que é executado em um sistema operacional multitarefa. Por padrão, uma QThread inicia a sua execução com o método denominado run( ), ao invés de iniciar no main ( ), que é a primeira função a ser executada por qualquer programa em C.

Para se criar uma thread é necessário criar uma classe e fazer de QThread uma subclasse e reimplementar o método run( ). Neste sentido, neste trabalho, criou-se uma classe denominada DEStruct, que possui como subclasse QThread e que contém o método run( ) reimplementado com o código que cada thread deverá conter. Desta maneira, cada thread que for criada, será alocada pelo sistema operacional em um núcleo diferente do processador.

Para que o aplicativo desenvolvido faça bom uso do recurso de hardware disponível do processador em que estiver sendo executado, ele identifica a quantidade de núcleos do computador usando o recurso QThread::idealThreadCount() e criar uma Thread para cada núcleo existente.

No entanto, quando se cria várias threads, é necessário que cada uma delas acesse uma determinada região de memória por vez. No aplicativo proposto, este controle foi realizado por meio das classes QSemaphore, QReadWriteLock, QWaitCondition e QMutex, fornecidas pelo SDK do Qt.

O controle e a identificação das threads criadas é realizada por meio de algumas variáveis estáticas, geradas para este fim, conforme mostrado no pseudocódigo da Figura B.1. Elas permitem identificar quantos objetos foram criados, isto é, quantas threads foram geradas e a sequência em que foram geradas.

class DEStruct : public QThread {

Q_OBJECT

Documentos relacionados