Skip to content

Commit 5b0d50f

Browse files
authored
Create Clear_Cache.py
1 parent 06632df commit 5b0d50f

File tree

1 file changed

+136
-0
lines changed

1 file changed

+136
-0
lines changed

Clear_Cache.py

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
import time
2+
import random
3+
import pandas as pd
4+
from statistics import mean, stdev
5+
import os
6+
7+
def split_matrix(matrix):
8+
rows, cols = len(matrix), len(matrix[0])
9+
split_row, split_col = rows // 2, cols // 2
10+
11+
A11 = [row[:split_col] for row in matrix[:split_row]]
12+
A12 = [row[split_col:] for row in matrix[:split_row]]
13+
A21 = [row[:split_col] for row in matrix[split_row:]]
14+
A22 = [row[split_col:] for row in matrix[split_row:]]
15+
16+
return A11, A12, A21, A22
17+
18+
def add_matrices(matrix1, matrix2):
19+
return [
20+
[matrix1[i][j] + matrix2[i][j] for j in range(len(matrix1[0]))]
21+
for i in range(len(matrix1))
22+
]
23+
24+
def subtract_matrices(matrix1, matrix2):
25+
return [
26+
[matrix1[i][j] - matrix2[i][j] for j in range(len(matrix1[0]))]
27+
for i in range(len(matrix1))
28+
]
29+
30+
def strassen(matrix1, matrix2):
31+
if len(matrix1) == 1:
32+
return [[matrix1[0][0] * matrix2[0][0]]]
33+
34+
A11, A12, A21, A22 = split_matrix(matrix1)
35+
B11, B12, B21, B22 = split_matrix(matrix2)
36+
37+
P1 = strassen(A11, subtract_matrices(B12, B22))
38+
P2 = strassen(add_matrices(A11, A12), B22)
39+
P3 = strassen(add_matrices(A21, A22), B11)
40+
P4 = strassen(A22, subtract_matrices(B21, B11))
41+
P5 = strassen(add_matrices(A11, A22), add_matrices(B11, B22))
42+
P6 = strassen(subtract_matrices(A12, A22), add_matrices(B21, B22))
43+
P7 = strassen(subtract_matrices(A11, A21), add_matrices(B11, B12))
44+
45+
C11 = subtract_matrices(add_matrices(P5, P4), subtract_matrices(P2, P6))
46+
C12 = add_matrices(P1, P2)
47+
C21 = add_matrices(P3, P4)
48+
C22 = subtract_matrices(subtract_matrices(P5, P3), subtract_matrices(P1, P7))
49+
50+
result = [
51+
C11[i] + C12[i]
52+
for i in range(len(C11))
53+
] + [
54+
C21[i] + C22[i]
55+
for i in range(len(C21))
56+
]
57+
58+
return result
59+
60+
def generate_random_matrix(rows, cols, seed=None):
61+
if seed is not None:
62+
random.seed(seed)
63+
return [[random.randint(1, 100) for _ in range(cols)] for _ in range(rows)]
64+
65+
def clear_cache():
66+
# Clear cache to ensure consistent benchmarking
67+
os.system('sync; echo 3 > /proc/sys/vm/drop_caches')
68+
69+
def pin_cpu():
70+
# Pin the process to the first CPU core
71+
os.system(f"taskset -p 0x1 {os.getpid()}")
72+
73+
def benchmark(matrix_size, repetitions=5, warm_up_runs=3, stress_runs=100, seed=None):
74+
data = {'Matrix Size': [], 'Run Number': [], 'Runtime (seconds)': []}
75+
76+
# Pin CPU
77+
pin_cpu()
78+
79+
# Warm-up phase
80+
for _ in range(warm_up_runs):
81+
matrix1 = generate_random_matrix(matrix_size, matrix_size, seed=seed)
82+
matrix2 = generate_random_matrix(matrix_size, matrix_size, seed=seed)
83+
strassen(matrix1, matrix2)
84+
85+
# Actual benchmarking
86+
for run_number in range(1, repetitions + 1):
87+
matrix1 = generate_random_matrix(matrix_size, matrix_size, seed=seed)
88+
matrix2 = generate_random_matrix(matrix_size, matrix_size, seed=seed)
89+
90+
clear_cache() # Clear cache before each run
91+
92+
start_time = time.perf_counter()
93+
strassen(matrix1, matrix2)
94+
end_time = time.perf_counter()
95+
96+
runtime = end_time - start_time
97+
98+
data['Matrix Size'].append(matrix_size)
99+
data['Run Number'].append(run_number)
100+
data['Runtime (seconds)'].append(runtime)
101+
102+
df = pd.DataFrame(data)
103+
average_runtimes = df.groupby('Matrix Size')['Runtime (seconds)'].agg([mean, stdev]).reset_index()
104+
print("\nAverage Runtimes:\n", average_runtimes)
105+
106+
# Stress testing
107+
stress_data = []
108+
for _ in range(stress_runs):
109+
matrix1 = generate_random_matrix(matrix_size, matrix_size, seed=seed)
110+
matrix2 = generate_random_matrix(matrix_size, matrix_size, seed=seed)
111+
112+
clear_cache() # Clear cache before each stress run
113+
114+
start_time = time.perf_counter()
115+
strassen(matrix1, matrix2)
116+
end_time = time.perf_counter()
117+
118+
runtime = end_time - start_time
119+
stress_data.append(runtime)
120+
121+
print(f"\nStress Testing for Matrix Size {matrix_size}x{matrix_size}:")
122+
print(f"Mean Runtime: {mean(stress_data)} seconds")
123+
print(f"Standard Deviation: {stdev(stress_data)} seconds")
124+
125+
return df
126+
127+
matrix_sizes = [2, 4, 8, 16, 32, 64, 128]
128+
repetitions = 5
129+
stress_runs = 100
130+
131+
all_data = pd.DataFrame()
132+
133+
for matrix_size in matrix_sizes:
134+
matrix_data = benchmark(matrix_size, repetitions=repetitions, stress_runs=stress_runs)
135+
all_data = pd.concat([all_data, matrix_data], ignore_index=True)
136+
print("\nCombined Data Table:\n", all_data)

0 commit comments

Comments
 (0)