float ComputeGravitation_SIMD_openmp( float *force[3], float *pos[4], float *mass, float softeningSquared, size_t N ) { chTimerTimestamp start, end; chTimerGetTime( &start ); #pragma omp parallel for for (int i = 0; i < N; i++) { v4sf ax = vec_zero; v4sf ay = vec_zero; v4sf az = vec_zero; v4sf *px = (v4sf *) pos[0]; v4sf *py = (v4sf *) pos[1]; v4sf *pz = (v4sf *) pos[2]; v4sf *pmass = (v4sf *) mass; v4sf x0 = _vec_set_ps1( pos[0][i] ); v4sf y0 = _vec_set_ps1( pos[1][i] ); v4sf z0 = _vec_set_ps1( pos[2][i] ); for ( int j = 0; j < N/4; j++ ) { bodyBodyInteraction( ax, ay, az, x0, y0, z0, px[j], py[j], pz[j], pmass[j], _vec_set_ps1( softeningSquared ) ); } // Accumulate sum of four floats in the AltiVec register force[0][i] = _vec_sum( ax ); force[1][i] = _vec_sum( ay ); force[2][i] = _vec_sum( az ); } chTimerGetTime( &end ); return (float) chTimerElapsedTime( &start, &end ) * 1000.0f; }
// // Get elapsed Time // double getTime() { return chTimerElapsedTime( &m_start, &m_end ); };