Bharath Ramesh, if you wish you can send the source to me and i will review it.

Dotan

Rick Jones wrote:
Gleb Natapov wrote:
On Wed, Oct 17, 2007 at 09:44:04AM +0200, Dotan Barak wrote:

Hi.

Bharath Ramesh wrote:

I wrote a simple test program to actual time it takes for RDMA read over
IB. I find a huge difference in the numbers returned by timing. I was
wondering if someone could help me in finding what I might be doing
wrong in the way I am measuring the time.

Steps I do for timing is as follows.

1) Create the send WR for RDMA Read.
2) call gettimeofday ()
3) ibv_post_send () the WR
4) Loop around ibv_poll_cq () till I get the completion event.
5) call gettimeofday ();

The difference in time would give me the time it takes to perform RDMA
read over IB. I constantly get around 35 microsecs as the timing which
seems to be really large considering the latency of IB. I am measuring
the time for transferring 4K bytes of data. If anyone wants I can send
the code that I have written. I am not subscribed to the list, if you
could please cc me in the reply.

I don't familiar with the implementation of gettimeofday, but i believe that this function do a context switch (and/or spend some time in the function to fill the struct that you supply to it)


Here:
    struct timeval tv_s, tv_e;
    gettimeofday(&tv_s, NULL);
    gettimeofday(&tv_e, NULL);
    printf("%d\n", tv_e.tv_usec - tv_s.tv_usec);
Compile and run it. The overhead of two calls to gettimeofday is at most
1 microsecond.

Unless there is contention with other gettimeofday() calls on the system - on SMP etc there are locks involved in making sure that each call to gettimeofday() does not go backwards and the like, and on some systems, with enough callers to gettimeofday() one can run into lock contention. So, while 99 times out of ten gettimeofday() may be "cheap" it really isn't a good idea to ass-u-me it will always be cheap.

And besides, the most efficient call is the one which is never made, so the suggestion to perform N operations between the calls is probably still a good one. Even for measuring the overhead of gettimeofday() :)

Also, while it may not be so much the case these days, certainly in the past there were "gettimeofday()" implementations which may have rather coarse granularity.

Now, some CPUs offer interval timer/registers/whatever - for example the ITC on Itanium or CR16 on PA-RISC, I'm sure there are other examples - which can be used for measuring very short things. Under some OSes - HP-UX and Solaris are two with which I am familiar - there is a "gethrtime()" interface which uses those without the user having to deal with inline assembly. That should have lower overhead than gettimeofday() although even then it would probably be best, if one is indeed going for the average, to use those to measure the time to perform N operations.

If one does use gethrtime(), it should only be for measuring short things, and those "timestamps" should not be interspersed with those from gettimeofday(). The two are really separate "timespaces" if you will. Gethrtime() does not get tick adjustment like gettimeofday() does/can.

rick jones

FWIW, netperf uses gettimeofday() to measure the overall runtime of a netperf test, and gethrtime() (when available) to measure the individual times for "transactions" such as the exchange of a request/response, or time spend in send() or recv() or whatnot.

--
            Gleb.
_______________________________________________
general mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general



_______________________________________________
general mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to