No description
We have an optimization for non-uniform if/else where if all channels meet the jump condition we emit a branch to jump straight to the ELSE block. Similarly, if at the end of the THEN block we don't have any channels that would execute the ELSE block, we emit a branch to jump straight to the AFTER block. This optimization has a cost though: we need to emit the condition for the branch and a branch instruction (which also comes with a 3 delay slot), so for very small blocks (just a couple of ALU for example) emitting the branch instruction is typically worse. Futher, if the condition for the branch is not met, we still pay the cost for no benefit at all. Here is an example: nop ; fmul.ifa rf26, 0x3e800000, rf54 xor.pushz -, rf52, 2 ; nop bu.alla 32, r:unif (0x00000000 / 0.000000) nop ; nop nop ; nop nop ; nop xor.pushz -, rf52, 3 ; nop nop ; mov.ifa rf52, 0 nop ; mov.pushz -, rf52 nop ; mov.ifa rf26, 0x3f800000 The bu instruction here is setup to jump over the following 4 instructions (the last 4 instructions in there). To do this, we pay the price of the xor to generate the condition, the bu instruction, and the 3 delay slots right after it, so we end up paying 6 instructions to skip over 4 which we pay always, even if the branch is not taken and we still have to execute those 4 instructions. With this change, we produce: nop ; fmul.ifa rf56, 0x3e800000, rf28 xor.pushz -, rf9, 3 ; nop nop ; mov.ifa rf9, 0 nop ; mov.pushz -, rf9 nop ; mov.ifa rf56, 0x3f800000 Now we don't try to skip the small block, ever. At worse, if all channels would have met the branch condition, we only pay the cost of the 4 instructions instead of 6, at best, if any channel wouldn't take the branch, we save ourselves 5 cycles for the branch condition, the branch instruction and its 3 delay slots. Reviewed-by: Alejandro Piñeiro <apinheiro@igalia.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23161> |
||
|---|---|---|
| .github/workflows | ||
| .gitlab/issue_templates | ||
| .gitlab-ci | ||
| android | ||
| bin | ||
| build-support | ||
| docs | ||
| include | ||
| src | ||
| subprojects | ||
| .dir-locals.el | ||
| .editorconfig | ||
| .gitattributes | ||
| .gitignore | ||
| .gitlab-ci.yml | ||
| .graphqlrc.yml | ||
| .mailmap | ||
| CODEOWNERS | ||
| meson.build | ||
| meson_options.txt | ||
| README.rst | ||
| VERSION | ||
`Mesa <https://mesa3d.org>`_ - The 3D Graphics Library ====================================================== Source ------ This repository lives at https://gitlab.freedesktop.org/mesa/mesa. Other repositories are likely forks, and code found there is not supported. Build & install --------------- You can find more information in our documentation (`docs/install.rst <https://mesa3d.org/install.html>`_), but the recommended way is to use Meson (`docs/meson.rst <https://mesa3d.org/meson.html>`_): .. code-block:: sh $ mkdir build $ cd build $ meson .. $ sudo ninja install Support ------- Many Mesa devs hang on IRC; if you're not sure which channel is appropriate, you should ask your question on `OFTC's #dri-devel <irc://irc.oftc.net/dri-devel>`_, someone will redirect you if necessary. Remember that not everyone is in the same timezone as you, so it might take a while before someone qualified sees your question. To figure out who you're talking to, or which nick to ping for your question, check out `Who's Who on IRC <https://dri.freedesktop.org/wiki/WhosWho/>`_. The next best option is to ask your question in an email to the mailing lists: `mesa-dev\@lists.freedesktop.org <https://lists.freedesktop.org/mailman/listinfo/mesa-dev>`_ Bug reports ----------- If you think something isn't working properly, please file a bug report (`docs/bugs.rst <https://mesa3d.org/bugs.html>`_). Contributing ------------ Contributions are welcome, and step-by-step instructions can be found in our documentation (`docs/submittingpatches.rst <https://mesa3d.org/submittingpatches.html>`_). Note that Mesa uses gitlab for patches submission, review and discussions.