我正在尝试使用 PyCUDA 并行化一些矩阵运算,并将其与 python 进行比较。
但是我有一个结果我真的不明白。当我将矩阵 A 的行数乘以矩阵乘积 A*B 的行数时,大多数情况下计算时间不会乘以 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)
当我运行它时,我对这两个计算有相同的数量级。
例如,这是我的输出:
第一行是我在A中有10^1行时的计算时间,第二行是我有10^2行时的计算时间(我在时间计算下也显示了A的形状)。
模拟 1:
3.120985184068559e-05
(10, 2)
9.086412319447845e-06
(100, 2)
模拟 2:
3.358022058819188e-05
(10, 2)
3.0024667466932442e-05
(100, 2)
模拟 3:
1.6987641174637247e-05
(10, 2)
1.7777763787307777e-05
(100, 2)
有时,对于多 10 倍的行,计算时间甚至更快!
你怎么解释这个?我真的不明白...事实上,如果矩阵 A 中的行多 10 倍,我要计算的系数就会多 10 倍。所以程序应该长 10 倍(因为没有并行化)。
最佳答案
这有多种原因。首先,作为Swier已经指出,函数的开销(Python 在实际调用函数之前所做的事情)比函数本身花费更多的时间。
然而,对于大输入,还有第二个更重要的问题:Numpy 使用一种叫做 BLAS 的东西。做矩阵运算。如果您的 BLAS 是这样配置的(特别是如果您使用的是 Anaconda,它会自动为您执行此操作),它将为您并行化代码,即使您不自己做也是如此。
关于python - 当矩阵中的行多 10 倍时,为什么 np.dot 不会(至少)长 10 倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47834603/