         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);
+
+            atomic_add(layer_updates[i * w_stride + tid], update);
         }
         
         /* Update the bias */

        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


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