File size: 5,730 Bytes
6d6f4dd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#!/usr/bin/env python3
import torch
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from datetime import datetime
import subprocess
import time
import psutil
import re
from collections import deque
import threading

class GPUBenchmark:
    def __init__(self):
        self.max_temp = 85
        self.temperatures = deque(maxlen=100)
        self.tflops_history = deque(maxlen=100)
        self.times = deque(maxlen=100)
        self.peak_tflops = 0
        self.running = True
        self.stress_size = 8192
        self.fig, (self.ax1, self.ax2) = plt.subplots(2, 1, figsize=(12, 8))
        self.fig.suptitle('Benchmark TFLOPS - Radeon Pro VII', fontsize=16)
        
    def get_gpu_temp(self):
        try:
            result = subprocess.run(['sensors'], capture_output=True, text=True, timeout=1)
            for line in result.stdout.split('\n'):
                if 'edge:' in line.lower():
                    match = re.search(r'([+-]?\d+\.?\d*)\s*°C', line)
                    if match:
                        return float(match.group(1))
        except:
            return 0
        return 0

    def check_system_responsiveness(self):
        try:
            start = time.time()
            _ = psutil.cpu_percent(interval=0.1)
            return (time.time() - start) < 0.5
        except:
            return False

    def calculate_tflops(self, matrix_size, elapsed_time):
        operations = 2 * (matrix_size ** 3)
        return (operations / elapsed_time) / 1e12

    def stress_gpu(self):
        device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
        if device.type == 'cpu':
            print("ERRO: GPU não detectada!")
            self.running = False
            return
        
        print(f"GPU detectada: {torch.cuda.get_device_name(0)}")
        print("Iniciando benchmark...\n")
        
        while self.running:
            temp = self.get_gpu_temp()
            if temp >= self.max_temp:
                print(f"\n⚠ TEMPERATURA LIMITE: {temp}°C")
                self.running = False
                break
            
            if not self.check_system_responsiveness():
                print("\n⚠ SISTEMA TRAVANDO")
                self.running = False
                break
            
            try:
                torch.cuda.synchronize()
                start = time.time()
                a = torch.randn(self.stress_size, self.stress_size, device=device)
                b = torch.randn(self.stress_size, self.stress_size, device=device)
                c = torch.mm(a, b)
                torch.cuda.synchronize()
                elapsed = time.time() - start
                
                tflops = self.calculate_tflops(self.stress_size, elapsed)
                self.temperatures.append(temp)
                self.tflops_history.append(tflops)
                self.times.append(datetime.now())
                
                if tflops > self.peak_tflops:
                    self.peak_tflops = tflops
                
                print(f"TFLOPS: {tflops:.2f} | Temp: {temp}°C | Peak: {self.peak_tflops:.2f}", end='\r')
                
                if temp < 75 and tflops < self.peak_tflops * 0.9:
                    self.stress_size = min(self.stress_size + 256, 16384)
                elif temp > 80:
                    self.stress_size = max(self.stress_size - 256, 4096)
                
                time.sleep(0.1)
            except Exception as e:
                print(f"\n⚠ ERRO: {e}")
                self.running = False
                break

    def update_plot(self, frame):
        if not self.running and len(self.tflops_history) == 0:
            return
        
        self.ax1.clear()
        self.ax2.clear()
        
        if len(self.tflops_history) > 0:
            self.ax1.plot(list(self.tflops_history), 'b-', linewidth=2, label='TFLOPS atual')
            self.ax1.axhline(y=self.peak_tflops, color='g', linestyle='--', 
                           label=f'Peak: {self.peak_tflops:.2f} TFLOPS')
            self.ax1.set_ylabel('TFLOPS', fontsize=12)
            self.ax1.set_title('Desempenho em Tempo Real')
            self.ax1.legend()
            self.ax1.grid(True, alpha=0.3)
        
        if len(self.temperatures) > 0:
            self.ax2.plot(list(self.temperatures), 'r-', linewidth=2, label='Temperatura')
            self.ax2.axhline(y=self.max_temp, color='orange', linestyle='--', 
                           label=f'Limite: {self.max_temp}°C')
            self.ax2.set_ylabel('Temperatura (°C)', fontsize=12)
            self.ax2.set_xlabel('Amostras', fontsize=12)
            self.ax2.legend()
            self.ax2.grid(True, alpha=0.3)
        
        if not self.running:
            self.ax1.text(0.5, 0.5, f'PEAK TFLOPS: {self.peak_tflops:.2f}', 
                         transform=self.ax1.transAxes, fontsize=20, 
                         ha='center', color='green', weight='bold')

    def run(self):
        stress_thread = threading.Thread(target=self.stress_gpu)
        stress_thread.daemon = True
        stress_thread.start()
        
        ani = animation.FuncAnimation(self.fig, self.update_plot, 
                                     interval=500, cache_frame_data=False)
        plt.tight_layout()
        plt.show()
        stress_thread.join(timeout=2)
        
        print(f"\n\n{'='*50}")
        print(f"RESULTADO FINAL")
        print(f"{'='*50}")
        print(f"🏆 PEAK TFLOPS: {self.peak_tflops:.2f}")
        print(f"🌡️  Temp máxima: {max(self.temperatures) if self.temperatures else 0:.1f}°C")
        print(f"{'='*50}\n")

if __name__ == "__main__":
    benchmark = GPUBenchmark()
    benchmark.run()