               float example_weight,
               int num_layers,
               float * scratch,  // shared memory scratch space
-              const float * const * w,  // weights for each layer
-              const float * const * biases, // for each layer
+              const float * w,  // weights for each layer, packed
+              const float * biases, // for each layer
               const int * architecture,
               const int * w_strides,
               UpdateFloat * const * w_updates, // wt updates for each layer

    */

    // Get our private scratch memory for this block
    layer_outputs += block_num * total_neurons * 8;
    
    unsigned example_num_base = block_num * examples_per_block;
    unsigned last_example = min(total_num_examples, example_num_base + examples_per_block);

        int ni = architecture[l];
        int no = architecture[l + 1];

        int w_stride = w_strides[l];

        next_weight_offset -= w_stride * ni;
        next_bias_offset -= no;

        UpdateFloat * layer_updates = w_updates[l];
        UpdateFloat * layer_bias_updates  = b_updates[l];
