Ajude a manter o site livre, gratuito e sem propagandas. Colabore!
Um condição de corrida (race condition) ocorre quando multiplas threads tentam acessar a mesma variável ao mesmo tempo. Isso pode levar a resultados inesperados, pois o valor da variável pode ser alterado por um thread enquanto outro thread está tentando lê-la ou escrevê-la.
Por exemplo, considere o seguinte código para computar o produto interno entre dois vetores de elementos randômicos. No código, a tarefa é distribuida para duas threads, em que cada uma computa o produto interno parcial de um pedaço dos vetores. O resultado é acumulado na variável dot
. Por fim, o código computa o erro entre o valor computado e o valor esperado. O código é o seguinte.
Cada vez que rodamos o código podemos obter um valor de erro diferente. Verifique! Mas, porquê há um erro? A explicação está relacionado ao fato da variável dot
ser compartilhada entre os threads. Variáveis declaradas foram de regiões paralelas, são variáveis compartilhadas em as threads. Já variáveis declaradas dentro de regiões paralelas são variáveis privadas, ou seja, cada thread tem sua própria cópia da variável.
O erro ocorre porque há uma condição de corrida na linha 41. A variável dot
é compartilhada entre os threads. Na linha 41, enquanto um thread está lendo o valor de dot
, outro thread pode estar escrevendo um novo valor. Ou seja, a variável dot
não é protegida contra acessos simultâneos. Isso leva a uma condição de corrida, onde o resultado final depende da ordem em que os threads acessam a variável.
Para evitar uma condição de corrida, precisamos proteger as operações de escrita e leitura de variáveis compartilhadas. Podemos fazer isso usando a diretiva omp critical
. A diretiva omp critical
define uma região crítica, onde apenas um thread pode acessar a variável compartilhada de cada vez.
Uma versão corrigida do Código 3 é dada a seguir. Verifique!
Localize e explique a condição de corrida do seguinte código.
É possível fazer essa computação em paralelo?
Não há como paralelizar esta computação.
O seguinte código é paralelamente ineficiente. Proponha uma nova versão mais eficiente.
Desenvolva um método com OpenMP/C++ para computar a integral de uma função em um intervalo pela regra composta de Simpson11endnote: 1Thomas Simpson, 1710 - 1761, matemático britânico. Fonte: Wikipédia: Thomas Simpson. com um número arbitrário de subintervalos .
Aproveito para agradecer a todas/os que de forma assídua ou esporádica contribuem enviando correções, sugestões e críticas!
Este texto é disponibilizado nos termos da Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional. Ícones e elementos gráficos podem estar sujeitos a condições adicionais.
Ajude a manter o site livre, gratuito e sem propagandas. Colabore!
Um condição de corrida (race condition) ocorre quando multiplas threads tentam acessar a mesma variável ao mesmo tempo. Isso pode levar a resultados inesperados, pois o valor da variável pode ser alterado por um thread enquanto outro thread está tentando lê-la ou escrevê-la.
Por exemplo, considere o seguinte código para computar o produto interno entre dois vetores de elementos randômicos. No código, a tarefa é distribuida para duas threads, em que cada uma computa o produto interno parcial de um pedaço dos vetores. O resultado é acumulado na variável dot
. Por fim, o código computa o erro entre o valor computado e o valor esperado. O código é o seguinte.
Cada vez que rodamos o código podemos obter um valor de erro diferente. Verifique! Mas, porquê há um erro? A explicação está relacionado ao fato da variável dot
ser compartilhada entre os threads. Variáveis declaradas foram de regiões paralelas, são variáveis compartilhadas em as threads. Já variáveis declaradas dentro de regiões paralelas são variáveis privadas, ou seja, cada thread tem sua própria cópia da variável.
O erro ocorre porque há uma condição de corrida na linha 41. A variável dot
é compartilhada entre os threads. Na linha 41, enquanto um thread está lendo o valor de dot
, outro thread pode estar escrevendo um novo valor. Ou seja, a variável dot
não é protegida contra acessos simultâneos. Isso leva a uma condição de corrida, onde o resultado final depende da ordem em que os threads acessam a variável.
Para evitar uma condição de corrida, precisamos proteger as operações de escrita e leitura de variáveis compartilhadas. Podemos fazer isso usando a diretiva omp critical
. A diretiva omp critical
define uma região crítica, onde apenas um thread pode acessar a variável compartilhada de cada vez.
Uma versão corrigida do Código 3 é dada a seguir. Verifique!
Localize e explique a condição de corrida do seguinte código.
É possível fazer essa computação em paralelo?
Não há como paralelizar esta computação.
O seguinte código é paralelamente ineficiente. Proponha uma nova versão mais eficiente.
Desenvolva um método com OpenMP/C++ para computar a integral de uma função em um intervalo pela regra composta de Simpson11endnote: 1Thomas Simpson, 1710 - 1761, matemático britânico. Fonte: Wikipédia: Thomas Simpson. com um número arbitrário de subintervalos .
Aproveito para agradecer a todas/os que de forma assídua ou esporádica contribuem enviando correções, sugestões e críticas!
Este texto é disponibilizado nos termos da Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional. Ícones e elementos gráficos podem estar sujeitos a condições adicionais.