Increase default -fmax-worker-args value
In #20325 I mention how I think we should likely consider some sort of cost model for W/W.
Until someone tackles this however we should probably increase -fmax-worker-args. Currently we (seemingly) arbitrarily use 10.
It seems that in the past we assumed the register pressure/higher argument count past 10 was more costly than the benefits from reducing allocations.
I was always a bit skeptical about claims that 10 is a good cutoff and that more args are generally worse even if we can unbox more in exchange. So today I went and benchmarked the range 6-20 because I wanted to check the behaviour.
Here are the general results. Although notice that in this case fmax-worker-args=6
is the baseline.
I would summarize the results thus:
- Changing
-fmax-worker-args
to 15 or higher seems decently beneficial in both bytes allocated and instructions executed. I assume that's where we are able to fully unbox some common dictionary? - Values between 6 and 14 don't make a huge difference overall. Although they can be beneficial or harmful to some individual benchmarks.
- If allocations go down through more W/W splits generally instructions executed do too.
# bytes allocated
+-------------------------------++--+--------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+
| || | _workers_06/ | std. err. | _workers_07/ (rel) | std. err. | _workers_08/ (rel) | std. err. | _workers_09/ (rel) | std. err. | _workers_10/ (rel) | std. err. | _workers_11/ (rel) | std. err. | _workers_12/ (rel) | std. err. | _workers_13/ (rel) | std. err. | _workers_14/ (rel) | std. err. | _workers_15/ (rel) | std. err. | _workers_16/ (rel) | std. err. | _workers_17/ (rel) | std. err. | _workers_18/ (rel) | std. err. | _workers_19/ (rel) | std. err. | _workers_20/ (rel) | std. err. |
+===============================++==+==============+===========+====================+===========+====================+===========+====================+===========+====================+===========+====================+===========+====================+===========+====================+===========+====================+===========+====================+===========+====================+===========+====================+===========+====================+===========+====================+===========+====================+===========+
| geom mean || | | | -0.02% | | +0.29% | | +0.08% | | +0.08% | | +0.08% | | +0.09% | | +0.09% | | +0.09% | | -0.14% | | -0.13% | | -0.14% | | -0.14% | | -0.14% | | -0.13% | |
+-------------------------------++--+--------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+
# instructions
+-------------------------------++--+--------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+
| || | _workers_06/ | std. err. | _workers_07/ (rel) | std. err. | _workers_08/ (rel) | std. err. | _workers_09/ (rel) | std. err. | _workers_10/ (rel) | std. err. | _workers_11/ (rel) | std. err. | _workers_12/ (rel) | std. err. | _workers_13/ (rel) | std. err. | _workers_14/ (rel) | std. err. | _workers_15/ (rel) | std. err. | _workers_16/ (rel) | std. err. | _workers_17/ (rel) | std. err. | _workers_18/ (rel) | std. err. | _workers_19/ (rel) | std. err. | _workers_20/ (rel) | std. err. |
+===============================++==+==============+===========+====================+===========+====================+===========+====================+===========+====================+===========+====================+===========+====================+===========+====================+===========+====================+===========+====================+===========+====================+===========+====================+===========+====================+===========+====================+===========+====================+===========+
| geom mean || | | | -0.03% | | +0.07% | | +0.02% | | +0.03% | | +0.03% | | +0.03% | | +0.05% | | +0.04% | | -0.10% | | -0.10% | | -0.10% | | -0.10% | | -0.09% | | -0.09% | |
+-------------------------------++--+--------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+
# LLC cache misses
+-------------------------------++--+--------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+
| || | _workers_06/ | std. err. | _workers_07/ (rel) | std. err. | _workers_08/ (rel) | std. err. | _workers_09/ (rel) | std. err. | _workers_10/ (rel) | std. err. | _workers_11/ (rel) | std. err. | _workers_12/ (rel) | std. err. | _workers_13/ (rel) | std. err. | _workers_14/ (rel) | std. err. | _workers_15/ (rel) | std. err. | _workers_16/ (rel) | std. err. | _workers_17/ (rel) | std. err. | _workers_18/ (rel) | std. err. | _workers_19/ (rel) | std. err. | _workers_20/ (rel) | std. err. |
+===============================++==+==============+===========+====================+===========+====================+===========+====================+===========+====================+===========+====================+===========+====================+===========+====================+===========+====================+===========+====================+===========+====================+===========+====================+===========+====================+===========+====================+===========+====================+===========+
| geom mean || | | | -0.00% | | -0.06% | | +0.00% | | -0.06% | | +0.02% | | -0.05% | | -0.07% | | -0.02% | | -0.06% | | +0.05% | | -0.08% | | -0.04% | | -0.05% | | -0.01% | |
+-------------------------------++--+--------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+
# L1 cache misses
+-------------------------------++--+--------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+
| || | _workers_06/ | std. err. | _workers_07/ (rel) | std. err. | _workers_08/ (rel) | std. err. | _workers_09/ (rel) | std. err. | _workers_10/ (rel) | std. err. | _workers_11/ (rel) | std. err. | _workers_12/ (rel) | std. err. | _workers_13/ (rel) | std. err. | _workers_14/ (rel) | std. err. | _workers_15/ (rel) | std. err. | _workers_16/ (rel) | std. err. | _workers_17/ (rel) | std. err. | _workers_18/ (rel) | std. err. | _workers_19/ (rel) | std. err. | _workers_20/ (rel) | std. err. |
+===============================++==+==============+===========+====================+===========+====================+===========+====================+===========+====================+===========+====================+===========+====================+===========+====================+===========+====================+===========+====================+===========+====================+===========+====================+===========+====================+===========+====================+===========+====================+===========+
| geom mean || | | | +0.04% | | +0.28% | | -0.02% | | +0.06% | | +0.11% | | +0.09% | | +0.07% | | +0.08% | | -0.06% | | -0.09% | | -0.11% | | -0.11% | | -0.09% | | -0.08% | |
+-------------------------------++--+--------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+
What does that mean?
- I think we can in good confidence increase -fmax-worker-args to 15, at least on x64.
- I don't think we have to be all that careful about increase the argument count of workers through W/W in general. So #20325 is indeed probably a good idea.