1
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
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
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.
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
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))
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
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)
No caso dos textos, seria o mesmo que o código abaixo, mas sem o paralelismo (sequencial):
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