Universidade Federal do Rio de Janeiro Escola Politécnica MBA em Engenharia de Computação Avançada (MBCA) Programação Paralela utilizando o.net Framework 4 Autor: Martius Eduardo Rodriguez Disciplina: Sistemas Avançados de Processamento Distribuídos, Gridding, Paralelo e Multiagentes Professor: Priscila Lima MBCA Julho de 2011 1
Sumário Capítulo 1: Introdução... 4 1.1 Objetivo... 4 1.2 Computação Paralela e.net Framework 4... 4 Capítulo 2: Embasamento Prático... 6 2.1 Namespace... 6 2.2 Parallel.Invoke... 6 2.3 Parallel.For... 8 2.4 Parallel.ForEach... 9 2.5 AsParallel... 10 Capítulo 3: Conclusão... 11 3.1 Conclusão... 11 Bibliografia... 12
Lista de Imagens 1.1 Arquitetura.NET Framework 4................................... 5 2.2 Resultado Parallel.Invoke........................................ 8 2.3 Resultado Parallel.For........................................... 9 2.4 Resultado Parallel.ForEach....................................... 10
Capítulo 1 Introdução 1.1 Objetivo O objetivo deste trabalho é fundamentar os conhecimentos sobre programação paralela usando a tecnologia.net Framework. A programação paralela em.net Framework é algo muito recente, pois esta tecnologia foi introduzida pela Microsoft na versão 3.5, porém aprimorada e acrescentada outras extensões na versão 4.0, dando suporte com o Task Parallel Library (TPL) e Parallel LINQ. 1.2 Computação Paralela e.net Framework 4 Os processadores estão, hoje, com mais de um núcleo. O que significa que podemos rodar aplicações simultaneamente. Ou seja, podemos paralelizar o código que distribuirá o trabalho para vários núcleos. Cada núcleo de um processador pode somente rodar uma tarefa de cada vez, se temos um processador com 4 núcleos podemos rodar 4 tarefas ao mesmo tempo. Sistemas distribuídos como clusters, Massively Parallel Processors (MPP) e grades (Grid) usam vários computadores para trabalhar em uma única tarefa. Arquiteturas paralelas são utilizadas para acelerar tarefas específicas, tarefas que um único computador demoraria anos para realizar. Na imagem 1.1 é possível ver a arquitetura no.net Framework 4.
Imagem 1.1 Arquitetura.NET Framework 4. Fonte: http://msdn.microsoft.com/en-us/library/dd460693.aspx.
Capítulo 2 Embasamento Prático 2.1 Namespace Em primeiro lugar, para começar a utilizar as classes que permitem a paralelizar o código é necessário inserir o namespace que contém estas classes. Para isso iremos inserir na primeira linha do código o comando: Visual Basic Imports System.Threading.Tasks C# using System.Threading.Tasks; Isso lhe permitirá a utilização dos comandos que iremos explicar nesse trabalho (a partir daqui, iremos focar na linguagem Visual Basic): Parallel.Invoke() Parallel.For() Parallel.ForEach() 2.2 Parallel.Invoke O método Invoke é a maneira mais fácil de chamar as funções em paralelo. Esse método só pode ser usado para chamar métodos que não retornam resultado. Veja o exemplo abaixo: Imports System.Threading.Tasks Public Class ClassePP Public Sub main()
Parallel.Invoke(New Action(AddressOf gerarnumeros), New Action(AddressOf gerartexto)) End Sub Public Sub gerarnumeros() Dim i As Integer For i = 0 To 15 Debug.Print("Gerar números: " & i) Next End Sub Private Sub gerartexto() Dim texto As String = "gerartexto" For i = 1 To Len(texto) Debug.Print("Gerar texto: " & Mid(texto, i, 1)) Next End Sub End Class Criamos uma classe chamada de ClassePP e nela adicionamos três procedimentos: main(), gerarnumeros() e gerartexto(). Instanciamos uma nova ação para cada procedimento. Depois usamos o AddressOf que cria uma instância de um delegate apontando o procedimento. Podíamos também criar um Array e jogar todas as ações lá e depois colocá-la como parâmetro para o método Invoke. Outra maneira de utilizar o método Invoke é inserir diretamente o procedimento como uma nova ação, veja: Parallel.Invoke(New Action(Sub() Dim i As Integer For i = 0 To 15 Debug.Print("Gerar números: " & i) Next End Sub), New Action(Sub() Dim texto As String = "gerartexto" For i = 1 To Len(texto) Debug.Print("Gerar texto: " & Mid(texto, i, 1)) Next End Sub)) Veja o resultado na imagem 2.2.
Imagem 2.2 Resultado Parallel.Invoke 2.3 Parallel.For O método For é usado quando a mesma função é utilizada simultaneamente. Veja o exemplo a seguir: Public Sub main() Parallel.For(0, 15, Sub(i) gerarnumerosfor(i)) Dim texto As String = "gerartexto" Parallel.For(1, Len(texto) + 1, Function(i) gerartextofor(texto, i)) End Sub Private Sub gerarnumerosfor(byval i As Integer) Debug.Print("Gerar números: " & i) End Function Private Function gerartextofor(byval texto As String, ByVal i As Integer) Debug.Print("Gerar texto: " & Mid(texto, i, 1)) Return "Funcionou" End Function Veja o resultado na imagem 2.3.
Imagem 2.3 Resultado Parallel.For 2.4 Parallel.ForEach O método ForEach assim como o For é quando a mesma função é utilizada simultaneamente. A diferença é que o ForEach utiliza uma coleção para pecorrer o loop. Veja o exemplo a seguir: Public Sub main() Dim textos() As String = {"g", "e", "r", "a", "r", "t", "e", "x", "t", "o"} Dim numeros() As Integer = Enumerable.Range(0, 14).ToArray() Parallel.ForEach(numeros, Function(i) gerarnumerosforeach(i)) Parallel.ForEach(textos, Sub(texto) gerartextoforeach(texto)) End Sub Private Function gerarnumerosforeach(byval i As Integer) Debug.Print("Gerar números: " & i) Return "Funcionou" End Function Private Sub gerartextoforeach(byval texto As String) Debug.Print("Gerar texto: " & texto) End Sub
(sequencial): No caso dos textos, seria o mesmo que o código abaixo, mas sem o paralelismo For Each texto In textos Debug.Print("Gerar texto: " & texto) Next Veja o resultado na imagem 2.4 Imagem 2.4 Resultado Parallel.ForEach 2.5 AsParallel O método AsParallel é utilizado para paralelizar Queries utilizando a Language Integrated Query (LINQ), tornando as consultas aos bancos de dados mais rápidas. A LINQ foi inspirada na Structured Query Language (SQL), uma linguagem padrão para comunicação com o banco de dados relacionais.
Capítulo 3 Conclusão 3.1 Conclusão No capítulo anterior não foi mencionado o tempo, pois a intenção era mostrar como utilizar os métodos de paralelismo do.net Framework, mas com certeza podemos aprimorar o código e mostrar que na programação paralela ganha-se muito com o tempo e escalabilidade. E quanto mais núcleos ou tarefas paralelas tiver, maior será este ganho.
Bibliografia Sites: http://msdn.microsoft.com/en-us/library/dd460717.aspx - 23/7/2011 http://pt.wikipedia.org/wiki/computa%c3%a7%c3%a3o_paralela 23/7/2011