我有一些scipy稀疏矩阵(目前采用CSR格式),我需要与密集的numpy 1D向量相乘.该向量称为G:
print G.shape, G.dtype
(2097152,) complex64
Run Code Online (Sandbox Code Playgroud)
每个稀疏矩阵都有形状(16384,2097152)并且非常稀疏.密度约为4.0e-6.我有一个名为100的这些稀疏矩阵的列表spmats.
我可以很容易地将每个矩阵相乘G:
res = [spmat.dot(G) for spmat in spmats]
Run Code Online (Sandbox Code Playgroud)
这导致(16384,)如预期的形状的密集矢量列表.
我的应用程序是相当性能的,因此我尝试了替代方法,即首先将所有稀疏矩阵连接成一个大的sparce矩阵,然后只使用一次这样的调用dot():
import scipy.sparse as sp
SPMAT = sp.vstack(spmats, format='csr')
RES = SPMAT.dot(G)
Run Code Online (Sandbox Code Playgroud)
这导致一个长矢量RES具有形状(1638400,),并且是res上述所有结果矢量的连接形式,如预期的那样.我检查过结果是一样的.
也许我完全错了,但我预计第二种情况应该比第一种情况要快,因为numpy调用,内存分配,python对象的创建,python循环等等都少得多.我不关心时间需要连接稀疏矩阵,只需要计算结果的时间.%timeit然而,根据:
%timeit res = [spmat.dot(G) for spmat in spmats]
10 loops, best of 3: 91.5 ms per loop
%timeit RES = SPMAT.dot(G)
1 loops, best of 3: 389 ms per …Run Code Online (Sandbox Code Playgroud) 我有一个大型 python 程序,使用 pyCUDA 和 numpy 进行一些繁重的数值运算。
它通常非常快,但似乎偶尔会随机地减慢 3-4 倍,没有明显的原因。
用 htop 观察 CPU 使用情况表明,每当速度减慢时,CPU 条就会变成红色,据我所知,这意味着“内核线程”。
但这到底意味着什么呢?我怎样才能找出是什么原因造成的?这种情况有时会在 GPU 执行任务时发生,有时会在 CPU 执行任务时发生。程序(运行几个小时)慢一个小时,自行恢复,快一个小时,然后问题再次出现。
有任何想法吗?您需要更多信息吗?