已合并
9.0.0合入英文图片 #8063
yanglu-1创建于 7月29日
9.0.0合入英文图片 #8063
已合并
从已删除 :9.0.0合入到cann/ops-nn9.0.0
共 64 个文件变更+39-40
| @@ -13,7 +13,7 @@ Developer contribution scenarios mainly include: | |||
| 13 | 13 | ||
| 14 | The operator development contribution process is as follows: | 14 | The operator development contribution process is as follows: |
| 15 | 15 | ||
| 16 | -<!--[Operator Development Contribution Process](./docs/en/figures/operator_development_contribution_process.png "Operator Development Contribution Process Diagram")--> | 16 | + |
| 17 | 17 | ||
| 18 | If you have a brand new operator that you want to design and implement based on NPU, we welcome you to propose your ideas and design solutions in an Issue. The complete contribution process is as follows: | 18 | If you have a brand new operator that you want to design and implement based on NPU, we welcome you to propose your ideas and design solutions in an Issue. The complete contribution process is as follows: |
| 19 | 19 | ||
| @@ -13,7 +13,7 @@ This guide aims to help you quickly get started with CANN and the `ops-nn` opera | |||
| 13 | 13 | ||
| 14 | The basic process of operator development and contribution is shown in the figure below. We welcome and encourage you to contribute operators in the community to jointly enrich the project ecosystem. | 14 | The basic process of operator development and contribution is shown in the figure below. We welcome and encourage you to contribute operators in the community to jointly enrich the project ecosystem. |
| 15 | 15 | ||
| 16 | -<!----> | 16 | + |
| 17 | 17 | ||
| 18 | To help you quickly understand the entire process of operator development, we will use the **AddExample** operator as a practical object. Its source files are located in `ops-nn/examples/add_example`. The specific operation steps are as follows: | 18 | To help you quickly understand the entire process of operator development, we will use the **AddExample** operator as a practical object. Its source files are located in `ops-nn/examples/add_example`. The specific operation steps are as follows: |
| 19 | 19 | ||
| @@ -31,11 +31,11 @@ For users without an environment, you can directly use the WebIDE development pl | |||
| 31 | 31 | ||
| 32 | 1. Enter the ops-nn open-source project and click the "`Cloud Development`" button. Log in with a certified Huawei Cloud account. If you have not registered or certified, please register and certify according to the page prompts. | 32 | 1. Enter the ops-nn open-source project and click the "`Cloud Development`" button. Log in with a certified Huawei Cloud account. If you have not registered or certified, please register and certify according to the page prompts. |
| 33 | 33 | ||
| 34 | - <!--<img src="docs/en/figures/cloudIDE.png" alt="Cloud Platform" width="750px" height="90px">--> | 34 | + <img src="docs/en/figures/cloudIDE.png" alt="Cloud Platform" width="750px" height="90px"> |
| 35 | 35 | ||
| 36 | 2. Create and start the cloud development environment according to the page prompts, and click "`Connect > WebIDE`" to enter the operator one-stop development platform. The resources of the open-source project are in the `/mnt/workspace` directory by default. | 36 | 2. Create and start the cloud development environment according to the page prompts, and click "`Connect > WebIDE`" to enter the operator one-stop development platform. The resources of the open-source project are in the `/mnt/workspace` directory by default. |
| 37 | 37 | ||
| 38 | - <!--<img src="docs/en/figures/webIDE.png" alt="Cloud Platform" width="1000px" height="150px">--> | 38 | + <img src="docs/en/figures/webIDE.png" alt="Cloud Platform" width="1000px" height="150px"> |
| 39 | 39 | ||
| 40 | 3. Check whether the environment is complete. | 40 | 3. Check whether the environment is complete. |
| 41 | 41 | ||
| @@ -12,7 +12,7 @@ | |||
| 12 | 12 | ||
| 13 | ops-nn is a high-level operator library that provides neural network computing capabilities in the [CANN](https://hiascend.com/software/cann) (Compute Architecture for Neural Networks) operator library, including matmul, activation, and other types of operators. The operator library architecture is shown below: | 13 | ops-nn is a high-level operator library that provides neural network computing capabilities in the [CANN](https://hiascend.com/software/cann) (Compute Architecture for Neural Networks) operator library, including matmul, activation, and other types of operators. The operator library architecture is shown below: |
| 14 | 14 | ||
| 15 | -<!--<img src="docs/en/figures/architecture.png" alt="Architecture Diagram" width="700px" height="320px">--> | 15 | +<img src="docs/en/figures/architecture.png" alt="Architecture Diagram" width="700px" height="320px"> |
| 16 | 16 | ||
| 17 | ## 📝Version Compatibility | 17 | ## 📝Version Compatibility |
| 18 | 18 | ||
| @@ -20,32 +20,32 @@ Quantization mode (also known as quantization granularity) refers to using diffe | |||
| 20 | 20 | ||
| 21 | Assuming the left matrix shape is (m, k) and the right matrix shape is (k, n), where k is the reduce axis, the generated quantization parameter shape is (1, ). | 21 | Assuming the left matrix shape is (m, k) and the right matrix shape is (k, n), where k is the reduce axis, the generated quantization parameter shape is (1, ). |
| 22 | 22 | ||
| 23 | - <!----> | 23 | +  |
| 24 | 24 | ||
| 25 | - perchannel quantization (abbreviated as C quantization): The quantization object is the right matrix, and each channel uses independent quantization parameters. | 25 | - perchannel quantization (abbreviated as C quantization): The quantization object is the right matrix, and each channel uses independent quantization parameters. |
| 26 | 26 | ||
| 27 | Assuming the right matrix shape is (k, n), where k is the reduce axis, the generated quantization parameter shape is (n, ). | 27 | Assuming the right matrix shape is (k, n), where k is the reduce axis, the generated quantization parameter shape is (n, ). |
| 28 | 28 | ||
| 29 | - <!----> | 29 | +  |
| 30 | 30 | ||
| 31 | - pertoken quantization (abbreviated as K quantization): The quantization object is the left matrix, and each token uses independent quantization parameters. | 31 | - pertoken quantization (abbreviated as K quantization): The quantization object is the left matrix, and each token uses independent quantization parameters. |
| 32 | 32 | ||
| 33 | Assuming the left matrix shape is (m, k), where k is the reduce axis, the generated quantization parameter shape is (m, ). | 33 | Assuming the left matrix shape is (m, k), where k is the reduce axis, the generated quantization parameter shape is (m, ). |
| 34 | 34 | ||
| 35 | - <!----> | 35 | +  |
| 36 | 36 | ||
| 37 | - pergroup quantization (abbreviated as G quantization): The quantization object can be either the left matrix or the right matrix. Data is grouped on the reduce axis, and each group uses independent quantization parameters. | 37 | - pergroup quantization (abbreviated as G quantization): The quantization object can be either the left matrix or the right matrix. Data is grouped on the reduce axis, and each group uses independent quantization parameters. |
| 38 | - Assuming the left matrix shape is (m, k), where k is the reduce axis, grouping on the k axis with group size gs, the generated quantization parameter shape is (m, k/gs). | 38 | - Assuming the left matrix shape is (m, k), where k is the reduce axis, grouping on the k axis with group size gs, the generated quantization parameter shape is (m, k/gs). |
| 39 | - Assuming the right matrix shape is (k, n), where k is the reduce axis, grouping on the k axis with group size gs, the generated quantization parameter shape is (k/gs, n). | 39 | - Assuming the right matrix shape is (k, n), where k is the reduce axis, grouping on the k axis with group size gs, the generated quantization parameter shape is (k/gs, n). |
| 40 | 40 | ||
| 41 | - <!----> | 41 | +  |
| 42 | 42 | ||
| 43 | - perblock quantization (abbreviated as B quantization): The quantization object can be either the left matrix or the right matrix. Data is blocked on all axes, and each block uses independent quantization parameters. | 43 | - perblock quantization (abbreviated as B quantization): The quantization object can be either the left matrix or the right matrix. Data is blocked on all axes, and each block uses independent quantization parameters. |
| 44 | 44 | ||
| 45 | - Assuming the left matrix shape is (m, k), where k is the reduce axis, grouping data by (bs, bs) blocks on the m and k axes respectively, where bs is block size, the generated quantization parameter shape is (m/bs, k/bs). | 45 | - Assuming the left matrix shape is (m, k), where k is the reduce axis, grouping data by (bs, bs) blocks on the m and k axes respectively, where bs is block size, the generated quantization parameter shape is (m/bs, k/bs). |
| 46 | - Assuming the right matrix shape is (k, n), where k is the reduce axis, grouping data by (bs, bs) blocks on the k and n axes respectively, where bs is block size, the generated quantization parameter shape is (k/bs, n/bs). | 46 | - Assuming the right matrix shape is (k, n), where k is the reduce axis, grouping data by (bs, bs) blocks on the k and n axes respectively, where bs is block size, the generated quantization parameter shape is (k/bs, n/bs). |
| 47 | 47 | ||
| 48 | - <!----> | 48 | +  |
| 49 | 49 | ||
| 50 | ## Common Combined Quantization | 50 | ## Common Combined Quantization |
| 51 | 51 | ||
| @@ -50,11 +50,11 @@ For users without an environment, you can directly use the WebIDE development pl | |||
| 50 | 50 | ||
| 51 | 1. Enter the open source project and click the "`Cloud Development`" button. Log in with a certified Huawei Cloud account. If you have not registered or certified, please register and certify according to the page prompts. | 51 | 1. Enter the open source project and click the "`Cloud Development`" button. Log in with a certified Huawei Cloud account. If you have not registered or certified, please register and certify according to the page prompts. |
| 52 | 52 | ||
| 53 | - <!--<img src="../figures/cloudIDE.png" alt="Cloud Platform" width="750px" height="90px">--> | 53 | + <img src="../figures/cloudIDE.png" alt="Cloud Platform" width="750px" height="90px"> |
| 54 | 54 | ||
| 55 | 2. Create and start the cloud development environment according to the page prompts. Click "`Connect > WebIDE`" to enter the operator one-stop development platform. The resources of the open source project are in the `/mnt/workspace` directory by default. | 55 | 2. Create and start the cloud development environment according to the page prompts. Click "`Connect > WebIDE`" to enter the operator one-stop development platform. The resources of the open source project are in the `/mnt/workspace` directory by default. |
| 56 | 56 | ||
| 57 | - <!--<img src="../figures/webIDE.png" alt="Cloud Platform" width="1000px" height="150px">--> | 57 | + <img src="../figures/webIDE.png" alt="Cloud Platform" width="1000px" height="150px"> |
| 58 | 58 | ||
| 59 | ### Using Docker Deployment | 59 | ### Using Docker Deployment |
| 60 | 60 | ||
| @@ -18,11 +18,11 @@ This section introduces common sparseModes and their corresponding scenario desc | |||
| 18 | 18 | ||
| 19 | The working principle of attenMask is to mask the value of the query (Q) and key (K) transpose matrix product at the position where Mask is True, as shown below: | 19 | The working principle of attenMask is to mask the value of the query (Q) and key (K) transpose matrix product at the position where Mask is True, as shown below: |
| 20 | 20 | ||
| 21 | -<!----> | 21 | + |
| 22 | 22 | ||
| 23 | The $QK^T$ matrix will be masked at the position where attenMask is True, with the following effect: | 23 | The $QK^T$ matrix will be masked at the position where attenMask is True, with the following effect: |
| 24 | 24 | ||
| 25 | -<!----> | 25 | + |
| 26 | 26 | ||
| 27 | ## sparseMode=0 | 27 | ## sparseMode=0 |
| 28 | 28 | ||
| @@ -30,43 +30,43 @@ When sparseMode is 0, it represents the defaultMask mode. | |||
| 30 | 30 | ||
| 31 | - No mask passed: If attenMask is not passed, no mask operation is performed. attenMask takes the value None, and preTokens and nextTokens values are ignored. The Masked $QK^T$ matrix is shown below: | 31 | - No mask passed: If attenMask is not passed, no mask operation is performed. attenMask takes the value None, and preTokens and nextTokens values are ignored. The Masked $QK^T$ matrix is shown below: |
| 32 | 32 | ||
| 33 | - <!----> | 33 | +  |
| 34 | 34 | ||
| 35 | - nextTokens is 0, preTokens is greater than or equal to Sq, indicating a causal scenario sparse. attenMask should pass a lower triangular matrix. At this time, the part between preTokens and nextTokens needs to be calculated. The Masked $QK^T$ matrix is shown below: | 35 | - nextTokens is 0, preTokens is greater than or equal to Sq, indicating a causal scenario sparse. attenMask should pass a lower triangular matrix. At this time, the part between preTokens and nextTokens needs to be calculated. The Masked $QK^T$ matrix is shown below: |
| 36 | 36 | ||
| 37 | - <!----> | 37 | +  |
| 38 | 38 | ||
| 39 | attenMask should pass a lower triangular matrix, as shown below: | 39 | attenMask should pass a lower triangular matrix, as shown below: |
| 40 | - | 40 | + |
| 41 | - <!----> | 41 | +  |
| 42 | 42 | ||
| 43 | - preTokens is less than Sq, nextTokens is less than Skv, and both are greater than or equal to 0, indicating a band scenario. At this time, the part between preTokens and nextTokens needs to be calculated. The Masked $QK^T$ matrix is shown below: | 43 | - preTokens is less than Sq, nextTokens is less than Skv, and both are greater than or equal to 0, indicating a band scenario. At this time, the part between preTokens and nextTokens needs to be calculated. The Masked $QK^T$ matrix is shown below: |
| 44 | 44 | ||
| 45 | - <!----> | 45 | +  |
| 46 | - | 46 | + |
| 47 | attenMask should pass a band-shaped matrix, as shown below: | 47 | attenMask should pass a band-shaped matrix, as shown below: |
| 48 | 48 | ||
| 49 | - <!----> | 49 | +  |
| 50 | 50 | ||
| 51 | - nextTokens is negative. Taking preTokens=9, nextTokens=-3 as an example, the part between preTokens and nextTokens needs to be calculated. The Masked $QK^T$ is shown below: | 51 | - nextTokens is negative. Taking preTokens=9, nextTokens=-3 as an example, the part between preTokens and nextTokens needs to be calculated. The Masked $QK^T$ is shown below: |
| 52 | 52 | ||
| 53 | **Note: When nextTokens is negative, preTokens must be greater than or equal to the absolute value of nextTokens, and the absolute value of nextTokens must be less than Skv.** | 53 | **Note: When nextTokens is negative, preTokens must be greater than or equal to the absolute value of nextTokens, and the absolute value of nextTokens must be less than Skv.** |
| 54 | - | 54 | + |
| 55 | - <!----> | 55 | +  |
| 56 | 56 | ||
| 57 | - preTokens is negative. Taking nextTokens=7, preTokens=-3 as an example, the part between preTokens and nextTokens needs to be calculated. The Masked $QK^T$ is shown below: | 57 | - preTokens is negative. Taking nextTokens=7, preTokens=-3 as an example, the part between preTokens and nextTokens needs to be calculated. The Masked $QK^T$ is shown below: |
| 58 | 58 | ||
| 59 | **Note: When preTokens is negative, nextTokens must be greater than or equal to the absolute value of preTokens, and the absolute value of preTokens must be less than Sq.** | 59 | **Note: When preTokens is negative, nextTokens must be greater than or equal to the absolute value of preTokens, and the absolute value of preTokens must be less than Sq.** |
| 60 | 60 | ||
| 61 | - <!----> | 61 | +  |
| 62 | - | 62 | + |
| 63 | ## sparseMode=1 | 63 | ## sparseMode=1 |
| 64 | 64 | ||
| 65 | When sparseMode is 1, it represents allMask, that is, passing the complete attenMask matrix. | 65 | When sparseMode is 1, it represents allMask, that is, passing the complete attenMask matrix. |
| 66 | 66 | ||
| 67 | In this scenario, nextTokens and preTokens values are ignored. The Masked $QK^T$ matrix is shown below: | 67 | In this scenario, nextTokens and preTokens values are ignored. The Masked $QK^T$ matrix is shown below: |
| 68 | 68 | ||
| 69 | -<!----> | 69 | + |
| 70 | 70 | ||
| 71 | ## sparseMode=2 | 71 | ## sparseMode=2 |
| 72 | 72 | ||
| @@ -74,11 +74,11 @@ When sparseMode is 2, it represents the leftUpCausal mode mask, corresponding to | |||
| 74 | 74 | ||
| 75 | In this scenario, preTokens and nextTokens values are ignored. The Masked $QK^T$ matrix is shown below: | 75 | In this scenario, preTokens and nextTokens values are ignored. The Masked $QK^T$ matrix is shown below: |
| 76 | 76 | ||
| 77 | -<!----> | 77 | + |
| 78 | 78 | ||
| 79 | The passed attenMask is an optimized compressed lower triangular matrix (2048\*2048). The compressed lower triangular matrix is shown below (same below): | 79 | The passed attenMask is an optimized compressed lower triangular matrix (2048\*2048). The compressed lower triangular matrix is shown below (same below): |
| 80 | 80 | ||
| 81 | -<!-- --> | 81 | + |
| 82 | 82 | ||
| 83 | ## sparseMode=3 | 83 | ## sparseMode=3 |
| 84 | 84 | ||
| @@ -86,13 +86,13 @@ When sparseMode is 3, it represents the rightDownCausal mode mask, corresponding | |||
| 86 | 86 | ||
| 87 | In this scenario, preTokens and nextTokens values are ignored. attenMask is an optimized compressed lower triangular matrix (2048\*2048). The Masked $QK^T$ matrix is shown below: | 87 | In this scenario, preTokens and nextTokens values are ignored. attenMask is an optimized compressed lower triangular matrix (2048\*2048). The Masked $QK^T$ matrix is shown below: |
| 88 | 88 | ||
| 89 | -<!----> | 89 | + |
| 90 | 90 | ||
| 91 | ## sparseMode=4 | 91 | ## sparseMode=4 |
| 92 | 92 | ||
| 93 | When sparseMode is 4, it represents the band scenario, that is, calculating the part between preTokens and nextTokens. The parameter starting point is the lower-right corner, and there must be an intersection between preTokens and nextTokens. attenMask is an optimized compressed lower triangular matrix (2048\*2048). The Masked $QK^T$ matrix is shown below: | 93 | When sparseMode is 4, it represents the band scenario, that is, calculating the part between preTokens and nextTokens. The parameter starting point is the lower-right corner, and there must be an intersection between preTokens and nextTokens. attenMask is an optimized compressed lower triangular matrix (2048\*2048). The Masked $QK^T$ matrix is shown below: |
| 94 | 94 | ||
| 95 | -<!----> | 95 | + |
| 96 | 96 | ||
| 97 | ## sparseMode=5 | 97 | ## sparseMode=5 |
| 98 | 98 | ||
| @@ -100,17 +100,17 @@ When sparseMode is 5, it represents the prefix non-compressed scenario, that is, | |||
| 100 | 100 | ||
| 101 | In this scenario, preTokens and nextTokens values are ignored. The attenMask matrix data format must be BNSS or B1SS. The Masked $QK^T$ matrix is shown below: | 101 | In this scenario, preTokens and nextTokens values are ignored. The attenMask matrix data format must be BNSS or B1SS. The Masked $QK^T$ matrix is shown below: |
| 102 | 102 | ||
| 103 | -<!----> | 103 | + |
| 104 | 104 | ||
| 105 | attenMask should pass a matrix as shown below: | 105 | attenMask should pass a matrix as shown below: |
| 106 | 106 | ||
| 107 | -<!----> | 107 | + |
| 108 | 108 | ||
| 109 | ## sparseMode=6 | 109 | ## sparseMode=6 |
| 110 | 110 | ||
| 111 | When sparseMode is 6, it represents the prefix compressed scenario, that is, in the prefix scenario, attenMask is an optimized compressed lower triangular + rectangular matrix (3072\*2048): the upper part is a [2048, 2048] lower triangular matrix, and the lower part is a [1024, 2048] rectangular matrix. The left half of the rectangular matrix is all 0, and the right half is all 1. attenMask should pass a matrix as shown below. In this scenario, preTokens and nextTokens values are ignored. | 111 | When sparseMode is 6, it represents the prefix compressed scenario, that is, in the prefix scenario, attenMask is an optimized compressed lower triangular + rectangular matrix (3072\*2048): the upper part is a [2048, 2048] lower triangular matrix, and the lower part is a [1024, 2048] rectangular matrix. The left half of the rectangular matrix is all 0, and the right half is all 1. attenMask should pass a matrix as shown below. In this scenario, preTokens and nextTokens values are ignored. |
| 112 | 112 | ||
| 113 | -<!----> | 113 | + |
| 114 | 114 | ||
| 115 | ## sparseMode=7 | 115 | ## sparseMode=7 |
| 116 | 116 | ||
| @@ -121,7 +121,7 @@ The Masked $QK^T$ matrix is shown below. In the second batch, the query is slice | |||
| 121 | - The last mask block of card 1 is a band-type mask. Configure preTokens=6 (ensure it is greater than or equal to the last Skv), nextTokens=-2. actual_seq_qlen should pass {3,5}, and actual_seq_kvlen should pass {3,9}. | 121 | - The last mask block of card 1 is a band-type mask. Configure preTokens=6 (ensure it is greater than or equal to the last Skv), nextTokens=-2. actual_seq_qlen should pass {3,5}, and actual_seq_kvlen should pass {3,9}. |
| 122 | - The mask type of card 2 remains unchanged after slicing. sparseMode is 3. actual_seq_qlen should pass {2,7,11}, and actual_seq_kvlen should pass {6,11,15}. | 122 | - The mask type of card 2 remains unchanged after slicing. sparseMode is 3. actual_seq_qlen should pass {2,7,11}, and actual_seq_kvlen should pass {6,11,15}. |
| 123 | 123 | ||
| 124 | -<!----> | 124 | + |
| 125 | 125 | ||
| 126 | **Note**: | 126 | **Note**: |
| 127 | 127 | ||
| @@ -141,7 +141,7 @@ The Masked $QK^T$ matrix is shown below. In the second batch, the query is slice | |||
| 141 | - The mask type of card 1 remains unchanged after slicing. sparseMode is 2. actual_seq_qlen should pass {3,5}, and actual_seq_kvlen should pass {3,7}. | 141 | - The mask type of card 1 remains unchanged after slicing. sparseMode is 2. actual_seq_qlen should pass {3,5}, and actual_seq_kvlen should pass {3,7}. |
| 142 | - The first mask block of card 2 is a band-type mask. Configure preTokens=4 (ensure it is greater than or equal to the first Skv), nextTokens=1. actual_seq_qlen should pass {3,8,12}, and actual_seq_kvlen should pass {4,9,13}. | 142 | - The first mask block of card 2 is a band-type mask. Configure preTokens=4 (ensure it is greater than or equal to the first Skv), nextTokens=1. actual_seq_qlen should pass {3,8,12}, and actual_seq_kvlen should pass {4,9,13}. |
| 143 | 143 | ||
| 144 | -<!----> | 144 | + |
| 145 | 145 | ||
| 146 | **Note**: | 146 | **Note**: |
| 147 | 147 | ||
| @@ -150,4 +150,3 @@ The Masked $QK^T$ matrix is shown below. In the second batch, the query is slice | |||
| 150 | - preTokens >= first_Skv. | 150 | - preTokens >= first_Skv. |
| 151 | - nextTokens >= first_Sq - first_Skv, configure according to the actual situation. | 151 | - nextTokens >= first_Sq - first_Skv, configure according to the actual situation. |
| 152 | - The current mode does not support the optional input pse. | 152 | - The current mode does not support the optional input pse. |
| 153 | - | ||
| @@ -161,7 +161,7 @@ Table 1 Simulation Result Analysis Parameter Description | |||
| 161 | 161 | ||
| 162 | ```bash | 162 | ```bash |
| 163 | Generate a performance analysis report in the current directory (default: analyze only core 0) | 163 | Generate a performance analysis report in the current directory (default: analyze only core 0) |
| 164 | - cannsim report -e /path/to/cannsim_{timestamp}_${user_app} | 164 | + cannsim report -e /path/to/cannsim_{timestamp}_${user_app} |
| 165 | 165 | ||
| 166 | Generate performance analysis reports for core 0, core 1, core 11, and core 12 in the specified directory | 166 | Generate performance analysis reports for core 0, core 1, core 11, and core 12 in the specified directory |
| 167 | cannsim report -e /path/to/cannsim_{timestamp}_${user_app} -o /path/to/report -n '0-1, 11-12' | 167 | cannsim report -e /path/to/cannsim_{timestamp}_${user_app} -o /path/to/report -n '0-1, 11-12' |
| @@ -177,7 +177,7 @@ Table 1 Simulation Result Analysis Parameter Description | |||
| 177 | 177 | ||
| 178 | 4. View simulation results | 178 | 4. View simulation results |
| 179 | Enter "chrome://tracing" in the Chrome browser and drag the generated instruction pipeline diagram file (trace.json) to the blank area to open it. Use keyboard shortcuts (W: zoom in, S: zoom out, A: move left, D: move right) to view the results. | 179 | Enter "chrome://tracing" in the Chrome browser and drag the generated instruction pipeline diagram file (trace.json) to the blank area to open it. Use keyboard shortcuts (W: zoom in, S: zoom out, A: move left, D: move right) to view the results. |
| 180 | - <!----> | 180 | +  |
| 181 | 181 | ||
| 182 | Table 2 Key Field Description | 182 | Table 2 Key Field Description |
| 183 | 183 | ||
| @@ -13,7 +13,7 @@ Operators can be invoked through multiple methods. This chapter uses the `AddExa | |||
| 13 | 13 | ||
| 14 | ### Invocation Process | 14 | ### Invocation Process |
| 15 | 15 | ||
| 16 | -<!----> | 16 | + |
| 17 | 17 | ||
| 18 | ### Sample Code | 18 | ### Sample Code |
| 19 | 19 | ||
| @@ -226,7 +226,7 @@ int main() | |||
| 226 | 226 | ||
| 227 | ### Invocation Process | 227 | ### Invocation Process |
| 228 | 228 | ||
| 229 | -<!----> | 229 | + |
| 230 | 230 | ||
| 231 | ### Sample Code | 231 | ### Sample Code |
| 232 | 232 | ||