> So what is different in your setup that causes this patch to make a
> difference for you?

Hmm. I agree it is somewhat strange.

Below is a simple test that attempts to compare htonl, CONSTANT_HTONL,
and an array-driven implementation. The code line is taken directly from htonl.
Could you compile and run it please?

I see:

$ gcc -O2 1.c
$ ./a.out
test1
122396.00 usec
test2
10517799.00 usec
test3
104099.00 usec

which seems to imply CONSTANT_HTONL is much faster.

Ideas?

-------------------------------


#include <stdio.h>
#include <sys/time.h>
#include <time.h>

#include <endian.h>

#define SIZE 255

enum ibv_send_flags {
        IBV_SEND_FENCE          = 1 << 0,
        IBV_SEND_SIGNALED       = 1 << 1,
        IBV_SEND_SOLICITED      = 1 << 2,
        IBV_SEND_INLINE         = 1 << 3
};

enum {
        MTHCA_NEXT_DBD       = 1 << 7,
        MTHCA_NEXT_FENCE     = 1 << 6,
        MTHCA_NEXT_CQ_UPDATE = 1 << 3,
        MTHCA_NEXT_EVENT_GEN = 1 << 2,
        MTHCA_NEXT_SOLICIT   = 1 << 1,
};

int ar[SIZE];


void init_ar()
{
        ar[0]=htonl(1);
        ar[IBV_SEND_SIGNALED]=htonl(MTHCA_NEXT_CQ_UPDATE|1);;
        ar[IBV_SEND_SOLICITED]=htonl(MTHCA_NEXT_SOLICIT|1);;
        
ar[IBV_SEND_SIGNALED|IBV_SEND_SOLICITED]=htonl(MTHCA_NEXT_CQ_UPDATE|MTHCA_NEXT_SOLICIT|1);;
}


int test1(int x) 
{
        return ar[x & (IBV_SEND_SIGNALED | IBV_SEND_SOLICITED)];
}


int test2(int x) 
{
        return 
                ((x & IBV_SEND_SIGNALED)  ? htonl(MTHCA_NEXT_CQ_UPDATE) : 0) |
                ((x & IBV_SEND_SOLICITED)  ? htonl(MTHCA_NEXT_SOLICIT) : 0) |
                htonl(1);
}

#if __BYTE_ORDER == __LITTLE_ENDIAN
#define CONSTANT_HTONL(x) \
        ((x >> 24) | ((x >> 8) & 0xff00) | ((x << 8) & 0xff0000) | (x << 24))
#elif __BYTE_ORDER == __BIG_ENDIAN
#define CONSTANT_HTONL(x) (x)
#else
#define CONSTANT_HTONL(x) htonl(x)
#endif

int test3(int x) 
{
        return 
                ((x & IBV_SEND_SIGNALED)  ? 
CONSTANT_HTONL(MTHCA_NEXT_CQ_UPDATE) : 0) |
                ((x & IBV_SEND_SOLICITED) ? CONSTANT_HTONL(MTHCA_NEXT_SOLICIT) 
: 0) |
                CONSTANT_HTONL(1);
}

struct timeval           start, end;

void timestart(void)
{
        if (gettimeofday(&start, NULL)) {
                perror("gettimeofday");
                return;
        }

}


void timeend(void)
{
        if (gettimeofday(&end, NULL)) {
                perror("gettimeofday");
                return;
        }

        {
                float usec = (end.tv_sec - start.tv_sec) * 1000000 +
                        (end.tv_usec - start.tv_usec);

                printf("%.2f usec\n", usec);
        }

}

main() 
{
        int i;

        init_ar();

        printf("test1\n");

        timestart();

        for (i=0; i<100000000; ++i) {
                (void) test1(IBV_SEND_SIGNALED);
                (void) test1(0);
                (void) test1(IBV_SEND_SIGNALED | IBV_SEND_SOLICITED);
                (void) test1(IBV_SEND_SOLICITED);
        }
        timeend();

        printf("test2\n");
        timestart();

        for (i=0; i<100000000; ++i) {
                (void) test2(IBV_SEND_SIGNALED);
                (void) test2(0);
                (void) test2(IBV_SEND_SIGNALED | IBV_SEND_SOLICITED);
                (void) test2(IBV_SEND_SOLICITED);
        }
        timeend();
        printf("test3\n");
        timestart();

        for (i=0; i<100000000; ++i) {
                (void) test3(IBV_SEND_SIGNALED);
                (void) test3(0);
                (void) test3(IBV_SEND_SIGNALED | IBV_SEND_SOLICITED);
                (void) test3(IBV_SEND_SOLICITED);
        }
        timeend();
}

-- 
MST

_______________________________________________
openib-general mailing list
openib-general@openib.org
http://openib.org/mailman/listinfo/openib-general

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

Reply via email to