Para todos os algoritmos baseados em árvores de decisão, a classificação consiste em basicamente fazer o registro de fluxo caminhar pela árvore e receber a classificação de acordo com o nó final [26]. Nesse caso, independente do algoritmo utilizado, o tempo necessário para obter a classificação será similar, já que apenas o tempo para que um registro caminhe pela árvore será computado. Dessa forma, apenas a velocidade de classificação do GSDT foi analisada. Os experimentos foram realizados através da execução de três implementações da classificação do algoritmo proposto (CPU, MT e GPU_v1). Na primeira, a classificação do algoritmo é executada na CPU sequencialmente, classificando um fluxo por vez. No segundo caso, a etapa classificatória é executada através de múltiplas linhas de execução (threads). O número de threads é fixado em oito, devido às características do processador utilizado na máquina classificadora. No último caso, a classificação é portada para a GPU, em que um grande número de fluxos é classificado em paralelo. A quantidade de fluxos classificados ao mesmo tempo para a versão GPU_v1 é definida através de uma variável do algoritmo, limitada pelo número de blocos suportado pela GPU utilizada, e que é definida como 65500. O objetivo desses experimentos é atestar a viabilidade da paralelização do algoritmo proposto.
Na Figura 5.10, é apresentado o tempo de classificação em milissegundos para o algoritmo em três casos: fluxo único na CPU (CPU), multithreaded (MT) e utilizando a GPU (GPU_v1). A fim
de simplificar e não gerar problemas com a nomenclatura, nesses experimentos a versão mais simples será denominada nos gráficos como CPU e a versão multithreaded como MT.
0 50 100 150 200 250 300 T e m p o e m m il is se g u n d o s M il h a re s
Tempo de classificação
CPU GPU MTFigura 5.10. Tempo de classificação utilizando as diferentes versões do GSDT
Algumas considerações interessantes podem ser feitas a partir dos resultados obtidos. Embora não fique explícito através da Figura 5.10, a versão multithreaded efetua a classificação mais rapidamente que a versão simples executada na CPU (sem GPU) para todos os tamanhos de trace. Adicionalmente, à medida que o tamanho do trace aumenta, a diferença entre essas versões no tempo necessário para a classificação cresce. Nesse caso, a versão multithreaded é mais eficiente em relação à velocidade de classificação que a versão CPU para todos os cenários avaliados. Além disso, nos traces menores, o desempenho do algoritmo executado na CPU supera a implementação utilizando a GPU. Embora os tempos medidos sejam muito pequenos e pouco representativos, na ordem de poucos milissegundos, a diferença existe e persiste até o Trace_100X. Para os traces maiores, a GPU_v1 se mostra benéfica. Isso se deve ao fato de que o paralelismo oferecido pela unidade de processamento gráfico não se sobrepõe ao custo computacional da mudança de plataforma. A transferência de dados entre host e dispositivo e a criação de muitos blocos de execução na GPU são os principais problemas do uso da GPU, promovendo uma sobrecarga considerável. Especificamente, a estrutura da árvore é totalmente copiada para a memória da GPU antes do início da classificação dos fluxos. Em seguida, a cada interação, os dados relativos aos fluxos são copiados para a GPU e sua classificação é copiada de volta para a CPU através de determinadas funções, com o objetivo de permitir a mudança de plataforma. Além disso, a cada chamada da função de classificação muitos blocos da GPU são criados (um para cada fluxo), proporcionando trocas de contexto dentro da própria unidade de processamento gráfico.
Ainda na Figura 5.10, observa-se uma tendência de afastamento entre as curvas que representam cada uma das versões. Nesse caso, é possível afirmar que para conjuntos de dados maiores a distância entre as curvas aumentará. Em resumo, a economia de tempo será crescente, considerando apenas números absolutos.
Na Tabela 5.1, são apresentados os valores utilizados para construir o gráfico da Figura 5.10 em milissegundos. Nesse caso, para cada uma das correspondências entre a versão da classificação e o trace utilizado, é exposto o tempo correspondente do processo de classificação. Nessa tabela, fica evidente que, no início, a classificação realizada na GPU_v1 é muito mais custosa para o Trace_1, por exemplo. Em seguida os valores começam se aproximando, até que a classificação na GPU_v1 ultrapasse as outras versões da classificação. Isso ocorre, no entanto, em instantes distintos.
Tabela 5.1. Tempo médio necessário para efetuar a classificação em milissegundos
CPU MT GPU_v1 Trace_1 48,2 ms 40,16 ms 437,44 ms Trace_10X 514,17 ms 337,46 ms 699,26 ms Trace_50X 2615,9 ms 1691,32 ms 1874,5 ms Trace_100X 5222,51 ms 3370,92 ms 3329,73 ms Trace_500X 25932,88 ms 16715,77 ms 14952,41 ms Trace_1000X 52323,06 ms 33940,46 ms 29818,69 ms Trace_2500X 131803,7 ms 84791,93 ms 72872,48 ms Trace_5000X 266100,25 ms 191285,57 ms 147331,69 ms
Por outro lado, à medida que os traces crescem, aumenta o número de fluxos e a sobrecarga gerada pelas mudanças de contexto torna-se menos significativa. Em valores absolutos, é notório o aumento da diferença entre os tempos de classificação, sendo cada vez maior o ganho obtido com a unidade de processamento gráfico.
Considerando o caso específico do maior conjunto de dados analisado, o Trace_5000X, o ganho obtido com o uso da GPU_v1 foi próximo a 45 segundos quando comparado à versão
multithreaded e de aproximadamente 2 minutos comparado à versão simples da CPU. Isso representa um ganho bastante relevante para uma ferramenta voltada para um fluxo contínuo de dados.
O Trace_5000X equivale a uma coleta de pacotes com duração de 5 minutos em um roteador com uma taxa de dados de aproximadamente 10 Gbps, exportando quase 40 milhões de fluxos nesse período. Nota-se que o período em que os fluxos são acumulados é de 5 minutos e, portanto, uma economia de um ou dois minutos é uma melhoria interessante. Considerando ainda que a coleta do arquivo de registros de fluxos ocorra durante 5 minutos, a relação entre o tempo necessário para realizar a classificação e o tempo necessário para efetuar a coleta é exposta na Figura 5.11. Essa relação é obtida pela divisão do tempo necessário em segundos pelo tempo da coleta, que é de 300 segundos. 0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 0,8 0,9 1