我在numpy中创建,乘以然后求和两个大矩阵的所有元素。我用两种方法做了几百次,一个循环,并在multiprocessing
模块的帮助下(参见下面的snipet)。
def worker_loop(n):
for i in n:
mul = np.sum(np.random.normal(size=[i,i])*np.random.normal(size=[i,i]))
def worker(i):
mul = np.sum(np.random.normal(size=[i,i])*np.random.normal(size=[i,i]))
n = range(100,300)
pool = ThreadPool(2)
pool.map(worker, n)
pool.close()
pool.join()
worker_loop(n)
测量时间表示循环比multiprocessing
快。我也试过threading
模块但没有成功(然后我读到这是一个坏主意;阅读更多here)
我开始尝试使用多线程,因为我需要将图像,标签,边界框等转换为tfrecords。为此,我正在研究tensorflow / inception的文件(如果你想留下build_imagenet_data.py, line 453)。我相信这里的多线程工作就是他们使用它的原因。
这样说,我的问题可以如下,
答案 0 :(得分:3)
总有一些开销(同步,数据准备,数据副本和合作)。
但是:给定一个好的设置,numpy中的矩阵向量和向量向量操作已经是多线程的,使用BLAS(这是迄今为止使用的最先进的标准,包括numpy,matlab和可能是tensorflow的cpu-backend;虽然有不同的实现。)
因此,如果BLAS能够占用所有核心(大尺寸更容易),那么您只能看到开销。
是的,它的核心中的tensorflow将由至少一个C / C ++ / Fortran加BLAS实现,因为它的CPU后端和一些Cuda-lib在定位GPU时。这也意味着,作为梯度计算和优化计算的核心算法永远不需要外部并行化(占所有用例的99.9%)。