feat(omp): add omp pragmas
authorametama <ametama@wafflesoft.org>
Thu, 18 Dec 2025 09:49:37 +0000 (10:49 +0100)
committerametama <ametama@wafflesoft.org>
Thu, 18 Dec 2025 09:49:37 +0000 (10:49 +0100)
src/swarm.c

index fbf92808b36a2f8a1b59f2f016583745366d2281..4d94c82c5d173d1bc3f577b57f9de4a6a7178511 100644 (file)
@@ -1,5 +1,6 @@
 #include <math.h>
 #include <stdlib.h>
+#include <omp.h>
 #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;
+    }
   }
 }