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
?