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;
}
Пример #2
0
	//
	// Get elapsed Time
	//
	double 
	getTime() { return chTimerElapsedTime( &m_start, &m_end ); };