2017-12-15 12 views
3

PyCUDA를 사용하여 일부 행렬 연산을 병렬 처리하려고하고 Python이 수행하는 것과 비교하기 위해 노력하고 있습니다.행렬에 10 배 이상의 행이있을 때 np.dot의 길이가 적어도 10 배 이상이되지 않습니다.

하지만 실제로 이해가되지 않는 결과가 있습니다. 행렬 곱 A * B에서 행렬 A의 행 수를 10으로 곱하면 계산 시간에 대부분 10을 곱하지 않습니다.

이 코드를 가지고 :

import time 
import numpy as np 

nb_traces=pow(10,1) # Nb lines 
nb_samples=100 # Nb columns 

a_cpu=np.ones((nb_traces,nb_samples)).astype(np.float32) 
b_cpu=np.ones((nb_samples,2)).astype(np.float32) 

t1PythonBegin=time.clock() 
c_cpu=np.dot(a_cpu,b_cpu) 
t1PythonEnd=time.clock() 

print(t1PythonEnd-t1PythonBegin) 
print(c_cpu.shape) 
print(" ") 
nb_traces=pow(10,2) # Nb lines of A : 10 times bigger than before 
nb_samples=100 # Nb colonnes 

a_cpu=np.ones((nb_traces,nb_samples)).astype(np.float32) 
b_cpu=np.ones((nb_samples,2)).astype(np.float32) 

t1PythonBegin=time.clock() 
c_cpu=np.dot(a_cpu,b_cpu) 
t1PythonEnd=time.clock() 

print(t1PythonEnd-t1PythonBegin) 
print(c_cpu.shape) 

나는 그것을 실행

, 나는 두 개의 계산을위한 동일한 정도의 크기를 가지고있다. 여기

내가 예를 들면 한 출력이다 :

첫 줄 I은 10^1 라인을 가지며 I 10^2 라인이있을 때 두 번째는 계산 시간이다 (I은 또한 형상을 표시 A의 시간 계산).

SIMU 1

3.120985184068559e-05 
(10, 2) 

9.086412319447845e-06 
(100, 2) 

SIMU 2

3.358022058819188e-05 
(10, 2) 

3.0024667466932442e-05 
(100, 2) 

SIMU 3

1.6987641174637247e-05 
(10, 2) 

1.7777763787307777e-05 
(100, 2) 

때때로 계산 시간도 빠르게 10 회 이상의 라인을 위해!

어떻게 설명합니까? 나는 정말로 이해하지 못합니다. 실제로 행렬 A에 10 배 더 많은 행이 있으면 실제로 계산할 수있는 계수가 10 배가됩니다. 따라서 프로그램은 병렬화 된만큼 10 배 길어야합니다.

+2

실제 계산에 오버 헤드보다 훨씬 적은 시간이 걸리는 것처럼 보입니다. 나를 위해 계산 시간은 10^3 라인 정도의 라인 수로 시작됩니다. – Swier

답변

4

여기에는 여러 가지 이유가 있습니다. 첫째, Swier이 지적했듯이, 함수에 대한 오버 헤드 (함수를 실제로 호출하기 전에 파이썬이하는 일)는 함수 자체보다 많은 시간이 걸립니다.

큰 입력의 경우 두 번째 중요한 문제가 있습니다. Numpy는 BLAS이라는 항목을 사용하여 행렬 연산을 수행합니다. BLAS가 그렇게 구성된 경우 (특히 자동으로 수행하는 Anaconda를 사용하는 경우) 은 직접 코드를 병렬 처리하지 않더라도 마찬가지입니다.