@@ -380,4 +380,70 @@ void BM_CPUHardRW(benchmark::State &state, T t)
380380 state.counters [" n_elem" ] = n;
381381}
382382
383+ inline float rand_float () {
384+ return static_cast <float >(rand ()) / static_cast <float >(RAND_MAX);
385+ }
386+
387+ template <typename T>
388+ void BM_nbody (benchmark::State &state, T t)
389+ {
390+ auto n = state.range (0 );
391+ float dt = 0 .01f ;
392+ const float softening = 1e-9f ;
393+
394+ std::vector<float > Fx (n, 0 .0f );
395+ std::vector<float > Fy (n, 0 .0f );
396+ std::vector<float > Fz (n, 0 .0f );
397+
398+ // Inizializza le posizioni e velocità
399+ for (int i = 0 ; i < n; ++i) {
400+ MEMBER_ACCESS (t, x, i) = rand_float ();
401+ MEMBER_ACCESS (t, y, i) = rand_float ();
402+ MEMBER_ACCESS (t, z, i) = rand_float ();
403+ MEMBER_ACCESS (t, vx, i) = rand_float ();
404+ MEMBER_ACCESS (t, vy, i) = rand_float ();
405+ MEMBER_ACCESS (t, vz, i) = rand_float ();
406+ }
407+
408+ for (auto _ : state) {
409+ // Calcolo delle forze
410+ for (int i = 0 ; i < n; ++i) {
411+ Fx[i] = 0 .0f ;
412+ Fy[i] = 0 .0f ;
413+ Fz[i] = 0 .0f ;
414+
415+ for (int j = 0 ; j < n; ++j) {
416+ if (i != j) {
417+ float dx = MEMBER_ACCESS (t, x, j) - MEMBER_ACCESS (t, x, i);
418+ float dy = MEMBER_ACCESS (t, y, j) - MEMBER_ACCESS (t, y, i);
419+ float dz = MEMBER_ACCESS (t, z, j) - MEMBER_ACCESS (t, z, i);
420+ float distSqr = dx * dx + dy * dy + dz * dz + softening;
421+ float invDist = 1 .0f / std::sqrt (distSqr);
422+ float invDist3 = invDist * invDist * invDist;
423+
424+ Fx[i] += dx * invDist3;
425+ Fy[i] += dy * invDist3;
426+ Fz[i] += dz * invDist3;
427+ }
428+ }
429+
430+ MEMBER_ACCESS (t, vx, i) += dt * Fx[i];
431+ MEMBER_ACCESS (t, vy, i) += dt * Fy[i];
432+ MEMBER_ACCESS (t, vz, i) += dt * Fz[i];
433+ }
434+
435+ // Integrazione posizioni
436+ for (int i = 0 ; i < n; ++i) {
437+ MEMBER_ACCESS (t, x, i) += MEMBER_ACCESS (t, vx, i) * dt;
438+ MEMBER_ACCESS (t, y, i) += MEMBER_ACCESS (t, vy, i) * dt;
439+ MEMBER_ACCESS (t, z, i) += MEMBER_ACCESS (t, vz, i) * dt;
440+ }
441+ }
442+
443+ state.counters [" n_elem" ] = n;
444+ state.counters [" N^2_interactions" ] = benchmark::Counter (
445+ static_cast <double >(n) * static_cast <double >(n),
446+ benchmark::Counter::kIsRate );
447+ }
448+
383449#endif // BENCHMARK_H
0 commit comments