Skip to content

Commit 06632df

Browse files
authored
Create cpu_pinned_Core_0.py
1 parent 55da591 commit 06632df

File tree

1 file changed

+143
-0
lines changed

1 file changed

+143
-0
lines changed

cpu_pinned_Core_0.py

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

0 commit comments

Comments
 (0)