SIMD Optimization - ProkopHapala/FireCore GitHub Wiki

SIMD n-Body problem

#include <immintrin.h>

typedef __m256 real;
struct real3 { real x, y, z; };

// i had to make up a value
const __m256 SOFTENING_SQUARED = _mm256_set1_ps(1.23f); 

real3 bodyBodyInteraction(real iPosx, real iPosy, real iPosz, 
                          real jPosx, real jPosy, real jPosz, real jMass)
{
  real rx, ry, rz;

  rx = jPosx - iPosx;
  ry = jPosy - iPosy;
  rz = jPosz - iPosz;

  real distSqr = rx*rx+ry*ry+rz*rz;
  distSqr += SOFTENING_SQUARED;

  real s = jMass / (_mm256_sqrt_ps(distSqr) * distSqr);

  real3 f;
  f.x = rx * s;
  f.y = ry * s;
  f.z = rz * s;

  return f;
}