Qual poderia ser a razão pela qual o código a seguir não funciona em paralelo?
#include <iostream>
#include <execution>
#include <unistd.h>
int main() {
std::vector<int> parts(10);
std::iota(parts.begin(), parts.end(), 0);
std::for_each(std::execution::par_unseq,
parts.begin(), parts.end(), [&](int part) {
usleep(1'000'000);
std::cout << part << std::endl;
});
return 0;
}
Este é o Linux Debian rodando em AMD e o código é compilado pelo seguinte comando
g++ -std=c++17 -fopenmp -O2 -o test test.cpp
O código deve gerar os números 0..9 em cerca de 1 segundo. Agora leva cerca de 10 segundos porque o código não é executado em paralelo.
Por falar nisso. A função usleep() pode ser substituída por alguma outra função pesada de cálculo, mas isso não muda a situação.
As políticas de execução paralela descrevem os tipos de paralelismo permitidos .
A implementação pode recorrer a uma política de execução sequencial se uma política paralela não for implementada, o que parece ser o seu caso. Em termos de detalhes de implementação, poderia ficar assim no arquivo de cabeçalho:
Algumas implementações podem usar condicionalmente essas políticas paralelas, dependendo de quais pacotes adicionais você instalou.