Nos últimos anos, surgiram várias bibliotecas / projetos de software que oferecem uma forma ou outra de paralelismo de memória compartilhada de uso geral orientado a dados.
A idéia principal é que, em vez de escrever um código explicitamente encadeado, os programadores implementam seus algoritmos como tarefas interdependentes, que são agendadas dinamicamente por um middleware de uso geral em uma máquina de memória compartilhada.
Exemplos dessas bibliotecas são:
QUARK : Originalmente projetado para a biblioteca de álgebra linear paralela MAGMA , parece ter sido usado também para um método multipolar rápido paralelo .
Cilk : Originalmente, um projeto baseado no MIT, agora suportado pela Intel, implementado como extensões de linguagem / compilador para C, usado no software de xadrez para computador Cilkchess e experimentalmente em FFTW .
Superescalar SMP : desenvolvido no Barcelona Supercomputing Center, semelhante ao Cilk em muitos aspectos, com base em
#pragma
extensões.StarPU : "codelets" baseados em bibliotecas semelhantes, que podem ser compilados e agendados em várias arquiteturas diferentes, incluindo GPUs.
Tarefas do OpenMP: A partir da versão 3.0, o OpenMP introduziu "tarefas" que podem ser agendadas de forma assíncrona (consulte a Seção 2.7 da especificação).
Blocos de construção de encadeamento da Intel : usa classes C ++ para criar e iniciar tarefas assíncronas, consulte a Seção 11 do Tutorial.
OpenCL : Suporta paralelismo baseado em tarefas em múltiplos núcleos.
Embora exista muita literatura descrevendo o trabalho interno dessas extensões de bibliotecas / linguagem e sua aplicação a problemas específicos, encontrei apenas poucos exemplos deles sendo utilizados na prática em aplicativos de computação científica.
Então, aqui está a pergunta: alguém sabe de códigos de computação científica usando alguma dessas bibliotecas / extensões de linguagem, ou similar, para paralelismo de memória compartilhada?
Respostas:
deal.II usa os Threading Building Blocks em toda a biblioteca e, em geral, estamos razoavelmente felizes com isso. Examinamos algumas alternativas, em particular o OpenMP, já que todo mundo parece estar usando isso para códigos mais simples, mas os encontrou ausentes. Em particular, o OpenMP tem a enorme desvantagem de que seu modelo de tarefa não permite que você identifique uma tarefa iniciada e, consequentemente, é difícil acessar o estado de uma tarefa (por exemplo, aguardar a conclusão) ou retornar valores de funções executadas em uma tarefa separada. O OpenMP é principalmente bom para paralelizar os loops mais internos, mas você obtém eficiência paralela paralelizando os loops mais complexos e externos , e o OpenMP não é a ferramenta para isso, enquanto o TBB é razoavelmente bom para isso.
fonte
Na minha opinião, esses sistemas foram relativamente mal-sucedidos devido principalmente aos seguintes motivos.
MPI_Comm
que permita que diferentes bibliotecas executem operações avançadas sem colidir, além de passar o contexto entre bibliotecas e recuperar os atributos necessários. A abstração fornecida pelo "comunicador" é importante para a composição da biblioteca, independentemente de a memória compartilhada ou distribuída ser usada.fonte