Estou tentando executar uma std::vector
redução de soma com uma declaração de redução OpenMP para ela:
// g++ -fopenmp MRE.cpp -o MRE
#include <vector>
#include <algorithm>
#include <omp.h>
struct Particles {
std::vector<double> fx;
};
#pragma omp declare reduction(vec_double_plus : std::vector<double> : \
std::transform(omp_out.begin(), omp_out.end(), omp_in.begin(), omp_out.begin(), std::plus<double>()) \
) initializer(omp_priv = decltype(omp_orig)(omp_orig.size()))
int main() {
Particles particles;
// Initialize fx vector with 100 elements
for (int i = 0; i < 100; ++i){
particles.fx.push_back(0.0);
}
// Parallel region to set the values of fx
#pragma omp parallel
{
// Thread-private local vector
std::vector<double> thread_fx(particles.fx.size(), 0.0);
#pragma omp for
for (size_t i = 0; i < particles.fx.size(); ++i){
thread_fx[i] = 1.0; // Assign values to thread_fx
}
// Now we reduce thread_fx into particles.fx
#pragma omp for reduction(vec_double_plus: particles.fx)
for (size_t i = 0; i < particles.fx.size(); ++i) {
particles.fx[i] += thread_fx[i];
}
}
return 0;
}
...mas o compilador reclama da ausência de declaração de redução para minha estrutura, mesmo que eu esteja executando a operação em um std::vector
tipo:
MRE.cpp: In function ‘int main()’:
MRE.cpp:31:57: error: expected ‘)’ before ‘.’ token
31 | #pragma omp for reduction(vec_double_plus: particles.fx)
| ^
| )
MRE.cpp:31:48: error: user defined reduction not found for ‘particles’
31 | #pragma omp for reduction(vec_double_plus: particles.fx)
Como declaro especificamente a cláusula de redução para um std::vector
dentro de um struct
?
Você não pode reduzir em membros struct, mas apenas no objeto inteiro. Não tenho certeza do que você tenta fazer com o código na região paralela, mas aqui está uma versão funcional que reduz o vetor de suas Partículas.
Para um padrão de acesso ao vetor como mostrado em seu MRE, você não precisaria de nenhuma redução. Você pode escrever com segurança em um objeto Particle compartilhado, porque os diferentes threads acessam as entradas exclusivamente.