Pergunta

Eu estou indo para equipar o meu motor de gráficos personalizados para que ele leva vantagem de múltiplos núcleos CPUs. Mais exatamente, eu estou olhando para uma biblioteca de loops de paralelizar.

Parece-me que tanto OpenMP e linha da Intel Building Blocks são muito bem adaptado para o trabalho. Além disso, ambos são suportados pelo compilador do Visual Studio C ++ ea maioria dos outros compiladores populares. E ambas as bibliotecas parece bastante direta de usar.

Então, o que eu devo escolher? Alguém já tentou duas bibliotecas e pode me dar alguns prós e contras do uso de qualquer biblioteca? Além disso, o que você escolher para trabalhar com no final?

Obrigado,

Adrian

Foi útil?

Solução

Eu não usei TBB extensivamente, mas a minha impressão é que eles complementam um ao outro mais do que concorrentes. TBB fornece Threadsafe contentores e alguns algoritmos paralelos, enquanto OpenMP é mais uma maneira de código existente parallelise.

Pessoalmente eu encontrei OpenMP muito fácil de cair em código existente, onde você tem um loop parallelisable ou grupo de seções que podem ser executados em paralelo. No entanto, não ajudá-lo particularmente para um caso em que é necessário modificar alguns dados compartilhados -. Onde os recipientes simultâneas de TBB pode ser exatamente o que você quer

Se tudo que você quer é laços parallelise onde as iterações são independentes (ou pode ser facilmente feito isso), eu iria para OpenMP. Se você vai precisar de mais interação entre os fios, acho TBB pode oferecer um pouco mais a esse respeito.

Outras dicas

A partir do blog software da Intel: Comparar Windows * threads, OpenMP *, Intel® threading Building Blocks para programação paralela

É também a questão de estilo - para mim TBB é muito C ++ como, enquanto eu não gosto de pragmas OpenMP que muito (cheira a C um pouco, seria usá-lo se eu tivesse que escrever em C)

Eu também consideraria o conhecimento existente e experiência da equipe. Aprender uma nova biblioteca (especialmente quando se trata de segmentação / concorrência) faz demorar algum tempo. Eu acho que, por enquanto, OpenMP é mais amplamente conhecido e implantado de TBB (mas isso é apenas a minha opinião).

No entanto, outro fator - mas considerando a maioria das plataformas comuns, provavelmente não um problema - a portabilidade. Mas a licença pode ser um problema.

  • TBB incorpora algumas das pesquisas agradável proveniente de pesquisa acadêmica, por exemplo dados recursiva paralelo abordagem .
  • Existe algum trabalho em cache-uso, para exemplo .
  • Palestra do blog Intel parece realmente interessante.

Em geral, eu descobri que o uso TBB requer muito mais demorado mudanças na base de código com um alto retorno, enquanto OpenMP dá um retorno rápido, mas moderada. Se você está olhando um novo módulo a partir do zero e pensar ir de longo prazo com TBB. Se você quiser pequenas, mas imediatos ganhos ir com OpenMP.

Além disso, TBB e OpenMP não são mutuamente exclusivas.

Eu realmente usado tanto, e minha impressão geral é que se o seu algoritmo é bastante fácil de fazer paralelo (por exemplo circuitos de tamanho mesmo, não muito interdependência de dados) OpenMP é mais fácil, e muito bom para trabalhar. Na verdade, se você achar que você pode usar OpenMP, é provavelmente o melhor caminho a percorrer, se você sabe sua plataforma vai apoiá-lo. Eu não usei novas estruturas de tarefas do OpenMP, que são muito mais geral do que as opções de loop e seção originais.

TBB lhe dá mais estruturas de dados na frente, mas definitivamente requer mais na frente. Como um plus, ele pode ser melhor em fazer você ciente dos erros de condição de corrida. O que quero dizer com isto é que é bastante fácil em OpenMP para permitir condições de corrida por não fazer algo compartilhado (ou qualquer outro) que deve ser. Você só vê isso quando você obter resultados ruins. Eu acho que isso é um pouco menos provável de ocorrer com TBB.

No geral a minha preferência pessoal foi para OpenMP, especialmente dada a sua maior expressividade com tarefas.

Viva64 links:. Parallel programação

Sim, TBB é muito mais C ++ amigável enquanto OpenMP é mais apropriado para o código FORTRAN de estilo C dado o seu design. O novo recurso de tarefa em OpenMP parece muito interessante, enquanto ao mesmo tempo o objeto Lambda e função em C ++ 0x pode fazer TBB mais fácil de usar.

No Visual Studio 2008, você pode adicionar a seguinte linha para paralelizar qualquer laço "for". Ele ainda trabalha com múltiplos laços for aninhados. Aqui está um exemplo:

#pragma omp parallel for private(i,j)
for (i=0; i<num_particles; i++)
{
  p[i].fitness = fitnessFunction(p[i].present);
  if (p[i].fitness > p[i].pbestFitness)
  { 
     p[i].pbestFitness = p[i].fitness;
     for (j=0; j<p[i].numVars; j++) p[i].pbest[j] = p[i].present[j];
  }
}  
gbest = pso_get_best(num_particles, p);

Depois que acrescentou o #pragma omp paralelo, ambos os núcleos no meu Core 2 Duo foram usadas para sua capacidade máxima, por isso o uso de CPU total passou de 50% a 100%.

Tanto quanto eu sei, TBB (há uma versão OpenSource sob GPLv2 disponíveis) Endereços mais o C ++, em seguida, C Área. Estes vezes é difícil encontrar C ++ e geral OOP paralelização específicas Informations.The maioria dos endereços de material funcional como c (o mesmo em CUDA ou OpenCL). Se você precisar de suporte C ++ para paralelização ir para TBB!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top