         float error = errors[tid];
         
         float d = (tid > no ? 0.0 : delta(prev_output, error, activation));
-        float d2 = 0.0;
 
         if (l > 0) {
             // Make sure all threads have caught up so that we can modify error

        int start_at = (example_num * thread_stride) % ni;

        for (unsigned i_ = start_at;  i_ < ni + start_at;  ++i_) {
            if (tid % 2 == 1) continue;

            // Get the real index of i
            unsigned i = i_ - (i_ >= ni) * ni;
            
            float prev = (l == 0 ? input[i] : last_layer_outputs[i]); 
            float update = prev * k * d;
            float update2 = prev * k * d2;

            ML::FixedPointAccum32 upd1(update), upd2(update2);

            unsigned long long two_updates
                = (((unsigned long long)upd2.rep) << 32)
                | upd1.rep;
            
            atomicAdd((unsigned long long *)(layer_updates
                                             + i * w_stride + tid),
                      two_updates);
            
            //atomic_add(layer_updates[i * w_stride + tid], update);
        }
        
        /* Update the bias */


            // Make sure everything can get its d value
            __syncthreads();
            
            double total = 0.0;
            if (tid < ni) {
