Qual é a diferença entre esses dois?
[UMA]
#pragma omp parallel
{
#pragma omp for
for(int i = 1; i < 100; ++i)
{
...
}
}
[B]
#pragma omp parallel for
for(int i = 1; i < 100; ++i)
{
...
}
Não acho que haja diferença, um é um atalho para o outro. Embora sua implementação exata possa lidar com eles de maneira diferente.
As construções de compartilhamento de trabalho paralelo combinadas são um atalho para especificar uma construção paralela contendo uma construção de compartilhamento de trabalho e nenhuma outra instrução. As cláusulas permitidas são a união das cláusulas permitidas para os construtos paralelos e de compartilhamento de trabalho.
Retirado de http://www.openmp.org/mp-documents/OpenMP3.0-SummarySpec.pdf
As especificações do OpenMP estão aqui:
Eles são equivalentes.
#pragma omp parallel
gera um grupo de threads, enquanto #pragma omp for
divide iterações de loop entre as threads geradas. Você pode fazer as duas coisas ao mesmo tempo com a #pragma omp parallel for
diretiva fundida .
schedule(static, chunk)
cláusula em para diretiva, tenho um problema. O código funciona bem, mas quando estou invocando esse código de um programa MPI, ele executa um loop infinito. O contador de loop é zero em todas as iterações deste loop. Eu tenho o contador de loop definido como privado na#pragma omp parallel
diretiva. Não tenho ideia de por que ele só falha quando o MPI está invocando o código. Tenho certeza de que cada processo MPI está sendo executado em um processador diferente do cluster, se isso importa. Não tenho ideia se a programação está causando o problema.#pragma omp parallel for
diretiva. Deve haver alguma diferença.Aqui está um exemplo de uso de separado
parallel
efor
aqui . Resumindo, ele pode ser usado para alocação dinâmica de arrays privados de threads do OpenMP antes de executar ofor
ciclo em várias threads. É impossível fazer a mesma inicialização noparallel for
caso.UPD: No exemplo da pergunta, não há diferença entre o pragma único e dois pragmas. Mas, na prática, você pode criar um comportamento mais ciente de thread com paralelas separadas e para diretivas. Alguns códigos, por exemplo:
fonte
Embora as duas versões do exemplo específico sejam equivalentes, conforme já mencionado nas demais respostas, ainda há uma pequena diferença entre elas. A primeira versão inclui uma barreira implícita desnecessária, encontrada no final do "omp para". A outra barreira implícita pode ser encontrada no final da região paralela. Adicionar "nowait" a "omp for" tornaria os dois códigos equivalentes, pelo menos de uma perspectiva OpenMP. Menciono isso porque um compilador OpenMP pode gerar um código ligeiramente diferente para os dois casos.
fonte
Estou vendo tempos de execução totalmente diferentes quando pego um loop for no g ++ 4.7.0 e uso
o código serial (não
openmp
) roda em 79 ms. o código "paralelo para" é executado em 29 ms. Se eu omitir ofor
e usar#pragma omp parallel
, o tempo de execução disparará para 179ms, que é mais lento do que o código serial. (a máquina tem simultaneidade hw de 8)o código liga a
libgomp
fonte
#pragma omp for
não há compartilhamento multi-thread do loop. Mas esse não foi o caso do OPs de qualquer maneira, tente novamente com um adicional#pragma omp for
dentro do#pragm omp parallel
e ele deve ser executado semelhante (se não o mesmo) à#pragma omp parallel for
versão.Obviamente, há muitas respostas, mas esta responde muito bem (com a fonte)
e:
https://bisqwit.iki.fi/story/howto/openmp/
fonte