的多线程版本纽比·埃因苏姆功能
einsumt的Python项目详细描述
埃因苏姆
的多线程版本纽比·埃因苏姆功能。在
推理
Numpy的einsum是一个非常棒的函数,它允许用一行清晰的代码执行复杂的数组操作。然而,该功能通常不会受益于底层多核体系结构,并且所有操作都在单个CPU上执行。在
其思想是沿着所选的下标拆分einsum输入操作数,在线程中执行计算,然后通过求和(如果输出中不存在下标)或部分结果的串联来合成最终结果。在
使用
此功能可替代numpy的einsum:
from einsumt import einsumt as einsum
result = einsum(*operands, **kwargs)
在当前实现中,第一个操作数必须是下标字符串。其他差异将被视为意外错误。在
标杆管理
为了测试,如果einsumt
在您的特定情况下是有益的,请运行基准测试,例如:
结果是:
Platform: Linux
CPU type: Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz
Subscripts: aijk,bkl->ail
Shapes of operands: (100, 100, 10, 10), (50, 10, 50)
Leading index: automatic
Pool type: default
Number of threads: 12
Execution time:
np.einsum: 2755 ms (average from 1 runs)
einsumt: 507.9 ms (average from 5 runs)
Speed up: 5.424x
更典型的基准调用包含在bench中_einsum.py公司文件。在
免责声明
在你开始因为很少或根本没有加速而责怪我之前,请记住线程化会花费额外的时间(例如,因为拆分和连接数据),所以einsumt
函数只对较大的数组有利。还请注意,在许多情况下,numpy的einsum可以有效地替换为优化的点、张量点、matmul、换位等等的组合,而不是{
- 项目
标签: