On Tue, 14 Jan 2025 08:07:52 -0800
Stephen Hemminger <step...@networkplumber.org> wrote:

> On Tue, 14 Jan 2025 17:22:08 +0800
> huangdengdui <huangdeng...@huawei.com> wrote:
> 
> > On 2025/1/11 1:20, Stephen Hemminger wrote:  
> > > This will make it slower for many platforms.
> > > GCC will unroll a loop of fixed small size, which is what we want.    
> > 
> > Do you mean to replace option with a macro?
> > But most of prefetch_offset are used with the nb_rx, So using macros is the 
> > same as using options.
> > 
> > const int32_t k = RTE_ALIGN_FLOOR(nb_rx, FWDSTEP);
> > for (j = 0; j != k; j += FWDSTEP) {
> >     for (i = 0, pos = j + prefetch_offset;
> >          i < FWDSTEP && pos < k; i++, pos++)
> >             rte_prefetch0(rte_pktmbuf_mtod(pkts_burst[pos], void *));
> >     processx4_step1(&pkts_burst[j], &dip, &ipv4_flag);
> >     processx4_step2(qconf, dip, ipv4_flag, portid,
> >                     &pkts_burst[j], &dst_port[j]);
> >     if (do_step3)
> >             processx4_step3(&pkts_burst[j], &dst_port[j]);
> > }
> > 
> > The option can dynamically adjust the prefetch window, which makes it 
> > easier to find the prefetch window for a HW platform.
> > So I think it's better to use option.  
> 
> The tradeoff is that loop unrolling most often is only done on small fix 
> sized loops.
> And the cost of a loop with variable small values (branch prediction) is high 
> enough that it 
> could make things slower.
> 
> Prefetching is a balancing act, and more is not better especially on real 
> workloads.

You might also want to look at the quad loop model used in VPP for prefetching.

https://my-vpp-docs.readthedocs.io/en/latest/gettingstarted/developers/vnet.html

Reply via email to