Tzachi Dar wrote: > Please commit. Done in svn 2877
> > Thanks > Tzachi > >> -----Original Message----- >> From: Smith, Stan [mailto:[email protected]] >> Sent: Monday, August 23, 2010 8:55 PM >> To: Tzachi Dar; Hefty, Sean; Alex Naslednikov >> Cc: [email protected] >> Subject: RE: [IPOIB_NDIS6_CM] enhance wc linking loop performance by >> removing array index calculations >> >> Tzachi Dar wrote: >>> By the way, by experiments that xalex has done in the past he saw >>> that actually the fastest way to initialize this lists was to >>> create the list once on another place and then do a memcopy of the >>> result every time you need the list. >>> >>> That said, I'm not sure that we want to go in that way. The best way >>> to improve performance here is very likely to drop the linked lists >>> and move to an array... >> >> Yes - an array interface would be the best. >> >> As a side note, using Sean's loop test pgm (modified to closer >> resemble ipoib wc init code), built in the WDK (x64) environment >> with no additional optimization switches, Sean's results are >> replicated: >> The wc pointer loop is slightly faster than using array indexes. >> >> MF:\Test-pgms\Loop-Timing>date /t & bin\amd64\lt.exe Mon 08/23/2010 >> loops 10000000 s 95622189567 e 95636499284 f 14318180 >> f1 0.99941 >> f2 0.78953 >> >> where f1 == >> for (i = 0; i < LOOPS; i++) { >> struct ibv_wc wc[MAX_SEND_WC]; >> int i; >> >> for (i = 0; i < MAX_SEND_WC; i++) { >> wc[i].next = &wc[i + 1]; >> } >> wc[MAX_SEND_WC - 1].next = NULL; >> } >> >> f2 == >> for (i = 0; i < LOOPS; i++) { >> struct ibv_wc wc[MAX_SEND_WC]; >> struct ibv_wc *p; >> >> for (p = wc; p < &wc[MAX_SEND_WC - 1]; p++ ) { >> p->next = p + 1; >> } >> p->next = NULL; >> } >> >> I beleve the ipoib loop performance patch is valid to commit, >> although not critical. >> >> stan. >> >>> >>> Thanks >>> Tzachi >>> >>>> -----Original Message----- >>>> From: Smith, Stan [mailto:[email protected]] >>>> Sent: Monday, August 09, 2010 11:23 PM >>>> To: Tzachi Dar >>>> Cc: [email protected] >>>> Subject: RE: [IPOIB_NDIS6_CM] enhance wc linking loop performance >>>> by removing array index calculations >>>> >>>> Tzachi Dar wrote: >>>>> Have you been actually being able to measure a difference? >>>>> >>>>> I believe that your code is better, but I wander if it really has >>>>> an affect that we can measure. >>>> >>>> In the following code sequence modified to use pointers (with >>>> Sean's observations) >>>> >>>> for( i = 0; i < MAX_SEND_WC; i++ ) >>>> wc[i].p_next = &wc[i + 1]; >>>> wc[MAX_SEND_WC - 1].p_next = NULL; >>>> >>>> for( p_free=wc; p_free < &wc[MAX_SEND_WC - 1]; p_free++ ) >>>> p_free->p_next = p_free + 1; >>>> p_free->p_next = NULL; >>>> >>>> If the MS WDK compiler optimizations are really 'good', it might >>>> optimize the loops to basically the same instruction sequence. I >>>> do not believe this to be the case. >>>> >>>> The slightly faster execution time is based on the observation that >>>> the total number of instructions executed is reduced by skipping >>>> the array index arithmetic by use of pointers. >>>> >>>> Since these loops live in the Tx & Rx speed paths, every little >>>> bit helps. >>>> >>>> >>>>> >>>>> Thanks >>>>> Tzachi >>>>> >>>>>> -----Original Message----- >>>>>> From: Smith, Stan [mailto:[email protected]] >>>>>> Sent: Wednesday, August 04, 2010 8:43 PM >>>>>> To: Tzachi Dar >>>>>> Cc: [email protected] >>>>>> Subject: [IPOIB_NDIS6_CM] enhance wc linking loop performance by >>>>>> removing array index calculations >>>>>> >>>>>> >>>>>> Hello, >>>>>> >>>>>> While reading IPOIB code I noticed a minor speed enhancement in >>>>>> CQ callback routines. When linking WC (work complete) items into >>>>>> a list, by removing the array index calculations in favor of >>>>>> pointer arithmetic the loop will execute slightly faster. >>>>>> >>>>>> Worth a commit? >>>>>> >>>>>> stan. >>>>>> >>>>>> --- A/ulp/ipoib_NDIS6_CM/kernel/ipoib_endpoint.cpp Wed Aug >>>>>> 04 10:30:43 2010 +++ >>>>>> B/ulp/ipoib_NDIS6_CM/kernel/ipoib_endpoint.cpp Wed Aug 04 >>>>>> 10:28:59 2010 @@ -888,9 +888,10 @@ >>>>>> p_port->p_adapter->p_ifc->modify_qp( p_endpt- >>>>>>> conn.h_send_qp, &mod_attr ); >>>>>> p_port->p_adapter->p_ifc->modify_qp( p_endpt- >>>>>>> conn.h_recv_qp, &mod_attr ); >>>>>> >>>>>> - for( i = 0; i < MAX_RECV_WC; i++ ) >>>>>> - wc[i].p_next = &wc[i + 1]; >>>>>> - wc[MAX_RECV_WC - 1].p_next = NULL; >>>>>> + for( p_free_wc=wc; p_free_wc < &wc[MAX_RECV_WC]; >>>>>> p_free_wc++ ) + p_free_wc->p_next = p_free_wc + 1; >>>>>> + + (--p_free_wc)->p_next = NULL; >>>>>> >>>>>> do >>>>>> { >>>>>> >>>>>> --- A/ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp Wed Aug 04 >>>>>> 10:29:33 2010 +++ B/ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp >>>>>> Wed Aug 04 10:28:31 2010 @@ -1987,7 +1987,6 @@ >>>>>> ib_wc_t wc[MAX_RECV_WC], *p_free, >>>>>> *p_wc; int32_t NBL_cnt, recv_cnt >>>>>> = 0, shortage, discarded; cl_qlist_t >>>>>> done_list, bad_list; - size_t i; >>>>>> ULONG recv_complete_flags = 0; >>>>>> BOOLEAN res; >>>>>> >>>>>> @@ -2017,9 +2016,11 @@ >>>>>> cl_qlist_init( &bad_list ); >>>>>> >>>>>> ipoib_port_ref( p_port, ref_recv_cb ); >>>>>> - for( i = 0; i < MAX_RECV_WC; i++ ) >>>>>> - wc[i].p_next = &wc[i + 1]; >>>>>> - wc[MAX_RECV_WC - 1].p_next = NULL; >>>>>> + >>>>>> + for( p_free=wc; p_free < &wc[MAX_RECV_WC]; p_free++ ) >>>>>> + p_free->p_next = p_free + 1; >>>>>> + >>>>>> + (--p_free)->p_next = NULL; >>>>>> >>>>>> /* >>>>>> * We'll be accessing the endpoint map so take a >>>>>> reference @@ -5769,7 +5770,6 @@ cl_qlist_t >>>>>> done_list; ipoib_endpt_t *p_endpt; >>>>>> ip_stat_sel_t type; >>>>>> - size_t i; >>>>>> NET_BUFFER *p_netbuffer = NULL; >>>>>> ipoib_send_NB_SG *s_buf; >>>>>> >>>>>> @@ -5798,9 +5798,10 @@ >>>>>> >>>>>> >>>>>> //cl_qlist_check_validity(&p_port->send_mgr.pending_list); >>>>>> ipoib_port_ref( p_port, ref_send_cb ); >>>>>> >>>>>> - for( i = 0; i < MAX_SEND_WC; i++ ) >>>>>> - wc[i].p_next = &wc[i + 1]; >>>>>> - wc[MAX_SEND_WC - 1].p_next = NULL; >>>>>> + for( p_free=wc; p_free < &wc[MAX_SEND_WC]; p_free++ ) >>>>>> + p_free->p_next = p_free + 1; >>>>>> + >>>>>> + (--p_free)->p_next = NULL; >>>>>> >>>>>> do >>>>>> { _______________________________________________ ofw mailing list [email protected] http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw
