From 8eecd045ed77a60495bbe8bbf43a9b4c7400be11 Mon Sep 17 00:00:00 2001 From: ametama Date: Thu, 18 Dec 2025 10:49:37 +0100 Subject: [PATCH] feat(omp): add omp pragmas --- src/swarm.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/swarm.c b/src/swarm.c index fbf9280..4d94c82 100644 --- a/src/swarm.c +++ b/src/swarm.c @@ -1,5 +1,6 @@ #include #include +#include #include "swarm.h" #include "vector.h" @@ -18,6 +19,7 @@ void pick(const int dim, const range *vrange, double *v) { void swarm_populate(swarm *sw, const range *rrange) { sw->particles = malloc(sizeof(particle) * sw->params.particlec); sw->global_best = &sw->particles[0]; + #pragma omp parallel for for (int p = 0; p < sw->params.particlec; p++) { particle *pt = &sw->particles[p]; pt->current.x = vec_alloc(sw->params.dim); @@ -29,22 +31,32 @@ void swarm_populate(swarm *sw, const range *rrange) { } pt->current.fitness = sw->params.f(pt->current.x); pt->best.fitness = pt->current.fitness; - if (pt->current.fitness < sw->global_best->current.fitness) sw->global_best = pt; + #pragma omp critical + { + if (pt->current.fitness < sw->global_best->current.fitness) + sw->global_best = pt; + } } } void swarm_velocity_update(swarm *sw) { + #pragma omp parallel for for (int p = 0; p < sw->params.particlec; p++) { particle *pt = &sw->particles[p]; for (int d = 0; d < sw->params.dim; d++) pt->velocity[d] = sw->params.w * pt->velocity[d] + sw->params.c * rands() * (pt->best.x[d] - pt->current.x[d]) + sw->params.s * rands() * (sw->global_best->current.x[d] - pt->current.x[d]); } + #pragma omp parallel for for (int p = 0; p < sw->params.particlec; p++) { particle *pt = &sw->particles[p]; vec_add(sw->params.dim, pt->velocity, pt->current.x); pt->current.fitness = sw->params.f(pt->current.x); if (pt->current.fitness < pt->best.fitness) pt->best = pt->current; - if (pt->current.fitness < sw->global_best->current.fitness) sw->global_best = &sw->particles[p]; + #pragma omp critical + { + if (pt->current.fitness < sw->global_best->current.fitness) + sw->global_best = pt; + } } } -- 2.34.1