Messages in this thread | | | Subject | Re: [PATCH] x86: Run checksumming in parallel accross multiple alu's | From | Eric Dumazet <> | Date | Fri, 18 Oct 2013 14:15:52 -0700 |
| |
On Fri, 2013-10-18 at 16:11 -0400, Neil Horman wrote:
> #define BUFSIZ_ORDER 4 > #define BUFSIZ ((2 << BUFSIZ_ORDER) * (1024*1024*2)) > static int __init csum_init_module(void) > { > int i; > __wsum sum = 0; > struct timespec start, end; > u64 time; > struct page *page; > u32 offset = 0; > > page = alloc_pages((GFP_TRANSHUGE & ~__GFP_MOVABLE), BUFSIZ_ORDER);
Not sure what you are doing here, but its not correct.
You have a lot of variations in your results, I suspect a NUMA affinity problem.
You can try the following code, and use taskset to make sure you run this on a cpu on node 0
#define BUFSIZ 2*1024*1024 #define NBPAGES 16
static int __init csum_init_module(void) { int i; __wsum sum = 0; u64 start, end; void *base, *addrs[NBPAGES]; u32 rnd, offset;
memset(addrs, 0, sizeof(addrs)); for (i = 0; i < NBPAGES; i++) { addrs[i] = kmalloc_node(BUFSIZ, GFP_KERNEL, 0); if (!addrs[i]) goto out; }
local_bh_disable(); pr_err("STARTING ITERATIONS on cpu %d\n", smp_processor_id()); start = ktime_to_ns(ktime_get()); for (i = 0; i < 100000; i++) { rnd = prandom_u32(); base = addrs[rnd % NBPAGES]; rnd /= NBPAGES; offset = rnd % (BUFSIZ - 1500); offset &= ~1U; sum = csum_partial_opt(base + offset, 1500, sum); } end = ktime_to_ns(ktime_get()); local_bh_enable();
pr_err("COMPLETED 100000 iterations of csum %x in %llu nanosec\n", sum, end - start);
out: for (i = 0; i < NBPAGES; i++) kfree(addrs[i]);
return 0; }
static void __exit csum_cleanup_module(void) { return; }
| |