
심심해서 Numpy VS Cupy 비교하는거 제미나이에게 코드 알려달라고하고 돌려봄
처음 500 x 500 dot 연산을 할 때는 아래처럼 CPU 연산이 더 빨랐음 근데 그 이후로 격차가 많이 벌어짐
Matrix_Size NumPy_CPU_Time_sec CuPy_GPU_Time_sec
0 500 0.004661 0.055479
1 1000 0.002308 0.000489
2 1500 0.006636 0.000963
3 2000 0.014849 0.001456
4 2500 0.028201 0.002311
5 3000 0.047539 0.003613
6 3500 0.073838 0.004931
7 4000 0.111359 0.007157
8 4500 0.156738 0.009763
9 5000 0.218565 0.012965
10 5500 0.302815 0.016005
11 6000 0.523119 0.021378
12 6500 0.666795 0.026053
13 7000 0.833786 0.031474
14 7500 1.037556 0.037216
15 8000 1.251499 0.043168
16 8500 1.493791 0.048980
17 9000 1.777411 0.058872
18 9500 2.072519 0.068760
19 10000 2.436849 0.081715
근데 이상한 점을 찾음
시작 단위를 1000으로 설정했을 때 결과임

Matrix_Size NumPy_CPU_Time_sec CuPy_GPU_Time_sec
0 1000 0.006211 0.054047
1 1500 0.006439 0.000978
2 2000 0.014703 0.001457
3 2500 0.029299 0.002313
4 3000 0.048384 0.003491
5 3500 0.073812 0.004973
6 4000 0.111116 0.007134
7 4500 0.157454 0.010056
8 5000 0.219925 0.012528
9 5500 0.282520 0.016595
10 6000 0.368199 0.020270
11 6500 0.464283 0.026957
12 7000 0.831613 0.030767
13 7500 1.031224 0.037647
14 8000 1.247854 0.042874
15 8500 1.491369 0.049043
16 9000 1.768675 0.059432
17 9500 1.736707 0.068297
18 10000 2.037836 0.079881
1000 사이즈일 때 결과가 다름
시작을 100으로 했을 때 결과

0 100 0.013119 0.058983
1 600 0.000701 0.000267
2 1100 0.002745 0.000509
3 1600 0.007946 0.000950
4 2100 0.017408 0.001782
5 2600 0.026053 0.002628
6 3100 0.043444 0.003965
7 3600 0.065285 0.005935
8 4100 0.094463 0.008257
9 4600 0.133098 0.009966
10 5100 0.184201 0.013590
11 5600 0.210941 0.017817
12 6100 0.311450 0.021450
13 6600 0.385196 0.027262
14 7100 0.612833 0.031805
15 7600 1.078487 0.037758
16 8100 1.312440 0.045940
17 8600 1.555496 0.050524
18 9100 1.833246 0.060776
19 9600 1.695122 0.073499
왜인지 모르겠는데 그냥 처음 결과만 gpu가 느린거같음
제미나이 코드
import numpy as np
import cupy as cp
import time
import matplotlib.pyplot as plt
def performance_test():
"""
행렬 크기를 500부터 3000까지 100씩 늘려가며
NumPy(CPU)와 CuPy(GPU)의 행렬 곱셈 속도를 측정하고 그래프로 시각화합니다.
"""
sizes = []
numpy_times = []
cupy_times = []
# 500부터 3000까지 100단위로 크기를 늘려가며 테스트
for size in range(1000, 10000+1, 1000):
print(f"Testing size: {size}x{size}")
sizes.append(size)
# Numpy (CPU) 테스트
np_a = np.random.rand(size, size).astype(np.float32)
np_b = np.random.rand(size, size).astype(np.float32)
start_time = time.time()
np.dot(np_a, np_b)
end_time = time.time()
numpy_times.append(end_time - start_time)
# Cupy (GPU) 테스트
# 데이터 전송 오버헤드를 포함하여 측정
cp_a = cp.asarray(np_a)
cp_b = cp.asarray(np_b)
start_time = time.time()
cp.dot(cp_a, cp_b)
cp.cuda.Stream.null.synchronize() # GPU 연산이 끝날 때까지 동기화
end_time = time.time()
cupy_times.append(end_time - start_time)
# 그래프 생성
plt.style.use('seaborn-v0_8-whitegrid')
plt.figure(figsize=(12, 7))
plt.plot(sizes, numpy_times, 'o-', label='NumPy (CPU)', color='blue')
plt.plot(sizes, cupy_times, 'o-', label='CuPy (GPU)', color='orange')
# 레이블 및 제목, 범례 추가
plt.xlabel('Matrix Size (N x N)')
plt.ylabel('Execution Time (seconds)')
plt.title('NumPy(CPU) vs CuPy(GPU) Matrix Multiplication Performance')
plt.legend()
plt.xticks(sizes, rotation=45)
plt.grid(True)
plt.tight_layout()
# 그래프를 파일로 저장하고 화면에 표시
plt.savefig('numpy_vs_cupy_performance.png')
plt.show()
if __name__ == '__main__':
performance_test()
