-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgraph_data_transfer.py
More file actions
77 lines (58 loc) · 2.43 KB
/
graph_data_transfer.py
File metadata and controls
77 lines (58 loc) · 2.43 KB
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
import matplotlib.pyplot as plt
import numpy as np
with open('output/performance_results.csv', 'r') as f:
lines = f.readlines()
header = lines[0].strip().split(',')
datasets = header[1:]
data = {}
for line in lines[1:]:
if line.strip():
parts = line.strip().split(',')
version = parts[0].strip()
times = []
for i in range(1, len(parts), 2):
times.append(float(parts[i+1].strip()))
data[version] = times
n_values = [2048, 16384, 65536]
k = 16
d_values = [16, 24, 32]
pcie_bandwidth = 32e9
transfer_fraction = {}
for idx, (n, d) in enumerate(zip(n_values, d_values)):
transfer_bytes = k * d * 8 + k * d * 8
theoretical_transfer_time_ms = (transfer_bytes / pcie_bandwidth) * 1000
for version in ['cuda_basic', 'cuda_shared', 'thrust']:
if version not in data:
continue
actual_time_ms = data[version][idx]
fraction = theoretical_transfer_time_ms / actual_time_ms
if version not in transfer_fraction:
transfer_fraction[version] = []
transfer_fraction[version].append(fraction * 100)
x = np.arange(len(datasets))
width = 0.25
fig, ax = plt.subplots(figsize=(10, 6))
bars1 = ax.bar(x - width, transfer_fraction['cuda_basic'], width, label='CUDA Basic')
bars2 = ax.bar(x, transfer_fraction['cuda_shared'], width, label='CUDA Shared')
bars3 = ax.bar(x + width, transfer_fraction['thrust'], width, label='Thrust')
ax.set_ylabel('Data Transfer Fraction (%)', fontsize=12)
ax.set_xlabel('Dataset Size', fontsize=12)
ax.set_title('Fraction of Runtime Spent in Host-Device Data Transfer\n(PCIe 4.0 x16 @ 32 GB/s)', fontsize=12)
ax.set_xticks(x)
ax.set_xticklabels(datasets)
ax.legend()
ax.grid(axis='y', alpha=0.3)
for bars in [bars1, bars2, bars3]:
for bar in bars:
height = bar.get_height()
ax.text(bar.get_x() + bar.get_width()/2., height,
f'{height:.3f}%',
ha='center', va='bottom', fontsize=9)
plt.tight_layout()
plt.savefig('output/data_transfer_plot.png', dpi=300, bbox_inches='tight')
print("Data transfer plot saved to output/data_transfer_plot.png")
print("\nData Transfer Fraction (%):")
print(f"{'Version':<15} {datasets[0]:<10} {datasets[1]:<10} {datasets[2]:<10}")
print("-" * 45)
for version in ['cuda_basic', 'cuda_shared', 'thrust']:
print(f"{version:<15} {transfer_fraction[version][0]:<10.4f} {transfer_fraction[version][1]:<10.4f} {transfer_fraction[version][2]:<10.4f}")