On Fri, Aug 14, 2015 at 09:44:28PM -0500, Scott Wood wrote:
> I tried a couple different benchmarks and didn't find a significant 
> difference, relative to the variability of the results running on the same 
> kernel.  A patch that claims to "optimize a bit" as its main purpose ought to 
> show some results. :-)

I tried to compare the execution time of these two code sequences with the
following test module:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/printk.h>

static void test1(void)
{
        int i;
        unsigned char lock, c;
        unsigned short cpu, s;

        for (i = 0; i < 100000; i++) {
                lock = 0;
                cpu = 1;

                asm volatile (  
"1:             lbarx   %0,0,%2\n\
                lhz     %1,0(%3)\n\
                cmpdi   %0,0\n\
                cmpdi   cr1,%1,1\n\
                addi    %1,%1,1\n\
                bne     2f\n\
                stbcx.  %1,0,%2\n\
                bne     1b\n\
2:"
                : "=&r" (c), "=&r" (s) : "r" (&lock), "r" (&cpu) : "cr0", 
"cr1", "memory"); 
        }
}

static void test2(void)
{
        int i;
        unsigned char lock, c;
        unsigned short cpu, s;

        for (i = 0; i < 100000; i++) {
                lock = 0;
                cpu = 1;

                asm volatile (  
"               lhz     %1,0(%3)\n\
                addi    %1,%1,1\n\
                crclr   cr1*4+eq\n\
1:              lbarx   %0,0,%2\n\
                cmpdi   %0,0\n\
                bne     2f\n\
                stbcx.  %1,0,%2\n\
                bne     1b\n\
2:"
                : "=&r" (c), "=&r" (s) : "r" (&lock), "r" (&cpu) : "cr0", 
"cr1", "memory"); 
        }
}

static int test_init(void)
{
        unsigned long s, e, tm1, tm2;

        __hard_irq_disable();
        /* Just for prefetch */
        test1();
        s = mftb();
        test1();
        e = mftb();
        tm1 = e - s;

        /* Just for prefetch */
        test2();
        s = mftb();
        test2();
        e = mftb();
        tm2 = e - s;
        __hard_irq_enable();

        pr_err("test1: %ld, test2: %ld, %%%ld\n", tm1, tm2, (tm1 - tm2) * 100 / 
tm1);

        return 0;
}

static void test_exit(void)
{
        return;
}

module_init(test_init);
module_exit(test_exit);
MODULE_LICENSE("GPL");

The results:
test1: 156568, test2: 151675, %3
test1: 156604, test2: 151670, %3
test1: 156567, test2: 151684, %3
test1: 156567, test2: 151678, %3
test1: 156567, test2: 151688, %3
test1: 156570, test2: 151683, %3
test1: 156565, test2: 151675, %3
test1: 156565, test2: 151673, %3

It seems that there do have a %3 gain in performance by moving the
3 instructions out of lbarx/stbcx loop.

Thanks,
Kevin

Attachment: pgpS6_d8tw8Wv.pgp
Description: PGP signature

_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to