zfec: reorder the inner loop to be more cache-friendly
authorzooko <zooko@zooko.com>
Mon, 12 Nov 2007 14:58:19 +0000 (20:28 +0530)
committerzooko <zooko@zooko.com>
Mon, 12 Nov 2007 14:58:19 +0000 (20:28 +0530)
Loop over this stride of each input block before looping over all strides of
this input block.  In theory, this should allow the strides of the input blocks
to remain in cache while we produce all of the output blocks.

darcs-hash:8f0ac74d2150507519463d2d711607f467f18ea6

zfec/zfec/fec.c

index 20546975d04d7bab3c2d1c940f17f9dd1a982759..84f4645d1263f95f0272db543912b922f5403244 100644 (file)
@@ -482,15 +482,16 @@ fec_encode(const fec_t* code, const gf*restrict const*restrict const src, gf*res
     unsigned fecnum;
     const gf* p;
 
-    for (i=0; i<num_block_nums; i++) {
-        fecnum=block_nums[i];
-        assert (fecnum >= code->k);
-        memset(fecs[i], 0, sz);
-        p = &(code->enc_matrix[fecnum * code->k]);
-// DUFF ME
-        for (k = 0; k < sz; k += STRIDE)
+    for (k = 0; k < sz; k += STRIDE) {
+        size_t stride = ((sz-k) < STRIDE)?(sz-k):STRIDE;
+        for (i=0; i<num_block_nums; i++) {
+            fecnum=block_nums[i];
+            assert (fecnum >= code->k);
+            memset(fecs[i]+k, 0, stride);
+            p = &(code->enc_matrix[fecnum * code->k]);
             for (j = 0; j < code->k; j++)
-                addmul(fecs[i]+k, src[j]+k, p[j], ((sz-k) < STRIDE)?(sz-k):STRIDE);
+                addmul(fecs[i]+k, src[j]+k, p[j], stride);
+        }
     }
 }