如果一个Pass需要针对某一类算子做处理, 并且这些算子之间彼此独立, 可以使用MLIR自带的多线程机制
IsolateFromAbove
IsolatedFromAbove
是一个操作属性,表示该操作是一个隔离单元(isolation unit)。这种隔离性意味着操作内部的区域(Region)不能访问和修改包含该操作的外部区域的变量或操作。换句话说,IsolatedFromAbove
操作的区域内的操作是独立的,它们只能访问和修改自己的区域内的内容,而不能影响到外部的状态。启用多线程
mlir的多线程在满足一下条件的时候自动启用:
- Op带有IsolateFromAbove属性
- Pass的level于需要启用的Op是同一级别的
当满足上述两个条件的时候自动启用多线程
禁用多线程
使用
MLIRContext::enableMultithreading(false)
来关闭多线程,默认打开多线程时间打印
启用多线程后,会新增“UserTime"列显示所有线程的总用时,"WallTime"列显示最长的单线程用时。总的来说,"WallTime" 表示实际经过的时间,“UserTime"表示CPU的总运行时间。
$ mlir-opt foo.mlir -pass-pipeline='builtin.module(func.func(cse,canonicalize),convert-func-to-llvm)' -mlir-timing ===-------------------------------------------------------------------------=== ... Pass execution timing report ... ===-------------------------------------------------------------------------=== Total Execution Time: 0.0078 seconds ---User Time--- ---Wall Time--- --- Name --- 0.0177 ( 88.5%) 0.0057 ( 71.3%) 'func.func' Pipeline 0.0044 ( 22.0%) 0.0015 ( 18.9%) CSE 0.0029 ( 14.5%) 0.0012 ( 15.2%) (A) DominanceInfo 0.0038 ( 18.9%) 0.0015 ( 18.7%) VerifierPass 0.0089 ( 44.6%) 0.0025 ( 31.1%) Canonicalizer 0.0006 ( 3.0%) 0.0002 ( 2.6%) VerifierPass 0.0004 ( 2.2%) 0.0004 ( 5.4%) VerifierPass 0.0013 ( 6.5%) 0.0013 ( 16.3%) LLVMLoweringPass 0.0006 ( 2.8%) 0.0006 ( 7.0%) VerifierPass 0.0200 (100.0%) 0.0081 (100.0%) Total