Resolved merge conflicts
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorReduction.h b/unsupported/Eigen/CXX11/src/Tensor/TensorReduction.h
index 01bccfd..99a09c0 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorReduction.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorReduction.h
@@ -325,11 +325,7 @@
 template <int B, int N, typename S, typename R, typename I>
 __global__ void FullReductionKernelHalfFloat(R, const S, I, half*, half2*);
 template <int NPT, typename S, typename R, typename I>
-<<<<<<< local
 __global__ void InnerReductionKernelHalfFloat(R, const S, I, I, half*);
-=======
-__global__ void InnerReductionKernelHalfFloat(R, const S, I, I, half*, half2*);
->>>>>>> other
 
 #endif
 
@@ -624,11 +620,7 @@
 #ifdef EIGEN_HAS_CUDA_FP16
   template <typename S, typename R, typename I> friend void internal::ReductionInitFullReduxKernelHalfFloat(R, const S, I, half2*);
   template <int B, int N, typename S, typename R, typename I> friend void internal::FullReductionKernelHalfFloat(R, const S, I, half*, half2*);
-<<<<<<< local
   template <int NPT, typename S, typename R, typename I> friend void internal::InnerReductionKernelHalfFloat(R, const S, I, I, half*);
-=======
-  template <int NPT, typename S, typename R, typename I> friend void internal::InnerReductionKernelHalfFloat(R, const S, I, I, half*, half2*);
->>>>>>> other
 #endif
   template <int NPT, typename S, typename R, typename I> friend void internal::InnerReductionKernel(R, const S, I, I, typename S::CoeffReturnType*);
 
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorReductionCuda.h b/unsupported/Eigen/CXX11/src/Tensor/TensorReductionCuda.h
index f0e8f3b..4f2dfcb 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorReductionCuda.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorReductionCuda.h
@@ -391,13 +391,8 @@
   eigen_assert(NumPerThread % unroll_times == 0);
   eigen_assert(unroll_times % 2 == 0);
 
-<<<<<<< local
   const Index input_col_blocks = divup<Index>(num_coeffs_to_reduce, blockDim.x * NumPerThread * 2);
   const Index num_input_blocks = divup<Index>(input_col_blocks * num_preserved_coeffs, 2);
-=======
-  const Index input_col_blocks = divup<Index>(num_coeffs_to_reduce, blockDim.x * NumPerThread/2);
-  const Index num_input_blocks = input_col_blocks * num_preserved_coeffs;
->>>>>>> other
 
   const Index num_threads = blockDim.x * gridDim.x;
   const Index thread_id = blockIdx.x * blockDim.x + threadIdx.x;
@@ -406,12 +401,8 @@
   if (gridDim.x == 1) {
     Index i = 2*thread_id;
     for (; i + 1 < num_preserved_coeffs; i += 2*num_threads) {
-<<<<<<< local
       half* loc = output + i;
       *((half2*)loc) = reducer.template initializePacket<half2>();
-=======
-      ((half2*)output)[i] = reducer.template initializePacket<half2>();
->>>>>>> other
     }
     if (i < num_preserved_coeffs) {
       output[i] = reducer.initialize();
@@ -419,13 +410,8 @@
     __syncthreads();
   }
 
-<<<<<<< local
   for (Index i = blockIdx.x; i < num_input_blocks; i += gridDim.x) {
     const Index row = 2 * (i / input_col_blocks);
-=======
-  for (Index i = 2*blockIdx.x; i < num_input_blocks; i += 2*gridDim.x) {
-    const Index row = i / input_col_blocks;
->>>>>>> other
 
     if (row + 1 < num_preserved_coeffs) {
       const Index col_block = i % input_col_blocks;
@@ -446,18 +432,10 @@
           }
           if (col < num_coeffs_to_reduce) {
             // Peel;
-<<<<<<< local
             const half last1 = input.m_impl.coeff(row * num_coeffs_to_reduce + col);
-=======
-            const half last1 = input.m_impl.coeff(row * num_coeffs_to_reduce + col+1);
->>>>>>> other
             const half2 val1 = __halves2half2(last1, reducer.initialize());
             reducer.reducePacket(val1, &reduced_val1);
-<<<<<<< local
             const half last2 = input.m_impl.coeff((row+1) * num_coeffs_to_reduce + col);
-=======
-            const half last2 = input.m_impl.coeff((row+1) * num_coeffs_to_reduce + col+1);
->>>>>>> other
             const half2 val2 = __halves2half2(last2, reducer.initialize());
             reducer.reducePacket(val2, &reduced_val2);
           }
@@ -466,17 +444,9 @@
           // Faster version of the loop with no branches after unrolling.
 #pragma unroll
           for (int k = 0; k < unroll_times; ++k) {
-<<<<<<< local
             const Index col = col_begin + blockDim.x * (j + k) * 2;
-=======
-            const Index col = col_begin + blockDim.x * (j + k);
->>>>>>> other
             reducer.reducePacket(input.m_impl.template packet<Unaligned>(row * num_coeffs_to_reduce + col), &reduced_val1);
-<<<<<<< local
             reducer.reducePacket(input.m_impl.template packet<Unaligned>((row + 1)* num_coeffs_to_reduce + col), &reduced_val2);
-=======
-            reducer.reducePacket(input.m_impl.template packet<Unaligned>((row +1)* num_coeffs_to_reduce + col), &reduced_val2);
->>>>>>> other
           }
         }
       }
@@ -494,12 +464,8 @@
       half2 val = __halves2half2(val1, val2);
 
       if ((threadIdx.x & (warpSize - 1)) == 0) {
-<<<<<<< local
         half* loc = output + row;
         atomicReduce((half2*)loc, val, reducer);
-=======
-        atomicReduce(&(((half2*)output)[row]), val, reducer);
->>>>>>> other
       }
     }
   }
@@ -554,33 +520,18 @@
   static bool run(const Self& self, Op& reducer, const GpuDevice& device, half* output, typename Self::Index num_coeffs_to_reduce, typename Self::Index num_preserved_vals) {
     typedef typename Self::Index Index;
 
-<<<<<<< local
     if (num_preserved_vals % 2 != 0) {
       // Not supported yet, revert to the slower code path
-      std::cout << "BYPASSING OPTIMIZED CODE PATH" << std::endl;
-=======
-    // It's faster to use the usual code.
-    if (num_coeffs_to_reduce <= 32) {
->>>>>>> other
       return true;
     }
 
     const Index num_coeffs = num_coeffs_to_reduce * num_preserved_vals;
-<<<<<<< local
     const int block_size = /*256*/128;
     const int num_per_thread = /*128*/64;
-=======
-    const int block_size = 256;
-    const int num_per_thread = 128;
->>>>>>> other
     const int dyn_blocks = divup<int>(num_coeffs, block_size * num_per_thread);
     const int max_blocks = device.getNumCudaMultiProcessors() *
                            device.maxCudaThreadsPerMultiProcessor() / block_size;
     const int num_blocks = numext::mini<int>(max_blocks, dyn_blocks);
-<<<<<<< local
-=======
-    half2* scratch = static_cast<half2*>(device.scratchpad());
->>>>>>> other
 
     if (num_blocks > 1) {
       // We initialize the outputs outside the reduction kernel when we can't be sure that there
@@ -590,19 +541,11 @@
                            device.maxCudaThreadsPerMultiProcessor() / 1024;
       const int num_blocks = numext::mini<int>(max_blocks, dyn_blocks);
       LAUNCH_CUDA_KERNEL((ReductionInitKernelHalfFloat<Self, Op, Index>),
-<<<<<<< local
                          1, 1, 0, device, reducer, self, num_preserved_vals, output);
-=======
-                         1, 1, 0, device, reducer, self, num_preserved_vals, scratch);
->>>>>>> other
     }
 
     LAUNCH_CUDA_KERNEL((InnerReductionKernelHalfFloat<num_per_thread, Self, Op, Index>),
-<<<<<<< local
                        num_blocks, block_size, 0, device, reducer, self, num_coeffs_to_reduce, num_preserved_vals, output);
-=======
-                       num_blocks, block_size, 0, device, reducer, self, num_coeffs_to_reduce, num_preserved_vals, output, scratch);
->>>>>>> other
 
     return false;
   }
@@ -632,14 +575,11 @@
     if (num_coeffs == 0) {
       return true;
     }
-<<<<<<< local
     // It's faster to use the usual code.
     if (num_coeffs_to_reduce <= 128) {
       return true;
     }
-=======
 
->>>>>>> other
     return InnerReductionLauncher<Self, Op>::run(self, reducer, device, output, num_coeffs_to_reduce, num_preserved_vals);
   }
 };
diff --git a/unsupported/test/cxx11_tensor_of_float16_cuda.cu b/unsupported/test/cxx11_tensor_of_float16_cuda.cu
index 71f79ab..34e9f54 100644
--- a/unsupported/test/cxx11_tensor_of_float16_cuda.cu
+++ b/unsupported/test/cxx11_tensor_of_float16_cuda.cu
@@ -255,13 +255,8 @@
 
   Eigen::CudaStreamDevice stream;
   Eigen::GpuDevice gpu_device(&stream);
-<<<<<<< local
   int num_elem = size1*size2;
   int result_size = (redux == 1 ? size1 : size2);
-=======
-  int size = 40;
-  int num_elem = size*size;
->>>>>>> other
 
   float* d_float1 = (float*)gpu_device.allocate(num_elem * sizeof(float));
   float* d_float2 = (float*)gpu_device.allocate(num_elem * sizeof(float));
@@ -291,6 +286,7 @@
   gpu_device.synchronize();
 
   for (int i = 0; i < result_size; ++i) {
+    std::cout << "EXPECTED " << full_prec(i) << " GOT " << half_prec(i) << std::endl;
     VERIFY_IS_APPROX(full_prec(i), half_prec(i));
   }