Skip to content

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% |           |
+-------------------------------++--+--------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+--------------------+-----------+

results

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.
Edited by Andreas Klebinger
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information