File size: 2,916 Bytes
be99550
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
// πŸš€ 100만 λ…Έλ“œ λŒ€κ·œλͺ¨ 병렬 + μ‹€μ‹œκ°„ νŒŒλ™ μ£Όμž… 톡합 벀치마크 (src/bin/run_large_scale.rs)
#[path="../live_streamer.rs"] mod live_streamer;
#[path="../parallel_engine.rs"] mod parallel_engine;
#[path="../korean_telemetry.rs"] mod korean_telemetry;

use std::time::Instant;
use live_streamer::LiveSignalStreamer;
use parallel_engine::LargeScaleEngine;
use korean_telemetry::TelemetryReporter;

fn main() {
    println!("============================================================");
    println!(" πŸš€ BioPhys 100만 λ…Έλ“œ(1024x1024) λŒ€κ·œλͺ¨ 병렬 μ—”μ§„ ꡬ동");
    println!("============================================================\n");

    let grid_size = 1024; // 1,048,576 λ…Έλ“œ
    let total_nodes = grid_size * grid_size;
    println!("βš™οΈ [μ‹œμŠ€ν…œ 사양] 총 {}개 8λŒ€ μœ„μƒ λ…Έλ“œ ν• λ‹Ή μ™„λ£Œ (1M Nodes)", total_nodes);

    let mut engine = LargeScaleEngine::new(grid_size);
    let mut streamer = LiveSignalStreamer::new(3.0); // 3Hz 고쑰파 νŒŒλ™

    println!("🌊 [μ‹€μ‹œκ°„ μ‹ ν˜Έ] 고주파 μ™ΈλΆ€ νŒŒλ™(Harmonic Wave) μ‹€μ‹œκ°„ μ£Όμž… μ‹œμž‘...\n");

    let total_ticks = 10;
    let start_time = Instant::now();

    for tick in 1..=total_ticks {
        // 1. μ™ΈλΆ€ μ‹€μ‹œκ°„ νŒŒλ™ μ‹ ν˜Έ 생성 및 μ•”λ°˜μΈ΅ μ£Όμž…
        let external_wave = streamer.generate_harmonic_wave(grid_size);
        for (b, w) in engine.bedrock.iter_mut().zip(external_wave.iter()) {
            *b = (*b * 0.7) + (*w * 0.3); // μ™ΈλΆ€ νŒŒλ™ μœ΅ν•©
        }

        // 2. 100만 λ…Έλ“œ λ©€ν‹°μŠ€λ ˆλ“œ 병렬 계산 (Rayon)
        let tick_start = Instant::now();
        let avg_energy = engine.step_parallel();
        let tick_dur = tick_start.elapsed();

        // 3. ν•œκ΅­μ–΄ ν…”λ ˆλ©”νŠΈλ¦¬ 보고
        let sample_phases: Vec<f32> = engine.topsoil[0..10_000].iter().map(|p| p.value()).collect();
        let report = TelemetryReporter::analyze(&sample_phases, avg_energy, tick);
        print!("{}", report);
        println!("   └─ 100만 λ…Έλ“œ 1-Tick μ†Œμš” μ‹œκ°„: {:.2} ms\n", tick_dur.as_secs_f64() * 1000.0);
    }

    let total_elapsed = start_time.elapsed().as_secs_f64();
    let total_cell_updates = (total_nodes as f64) * (total_ticks as f64);
    let mega_updates_per_sec = (total_cell_updates / total_elapsed) / 1_000_000.0;

    println!("============================================================");
    println!(" πŸ“Š λŒ€κ·œλͺ¨ 병렬 μ‹€μΈ‘ 벀치마크 κ²°κ³Ό");
    println!("============================================================");
    println!(" ⏱️ 총 μ—°μ‚° μ‹œκ°„         : {:.4} 초", total_elapsed);
    println!(" πŸ”„ 총 κ°±μ‹  μ…€ 수        : {:.1} Million Cells", total_cell_updates / 1_000_000.0);
    println!(" ⚑ λ©€ν‹°μŠ€λ ˆλ“œ μ²˜λ¦¬λŸ‰     : {:.2} MCell/sec (μ΄ˆλ‹Ή μˆ˜μ–΅ 개 μ…€)", mega_updates_per_sec);
    println!("============================================================");
}