   Tensor<float, 2> full_prec(rows, cols);
   gpu_device.memcpyDeviceToHost(half_prec.data(), d_res_half, num_elem*sizeof(float));
   gpu_device.memcpyDeviceToHost(full_prec.data(), d_res_float, num_elem*sizeof(float));
+  gpu_device.synchronize();
 
   for (int i = 0; i < rows; ++i) {
     for (int j = 0; j < cols; ++j) {
+      std::cout << "Checking contract " << i << " " << j << std::endl;
       VERIFY_IS_APPROX(full_prec(i, j), half_prec(i, j));
     }
   }


  Tensor<float, 1> half_prec(size);
  Tensor<float, 1> full_prec(size);
  gpu_device.memcpyDeviceToHost(half_prec.data(), d_res_half, num_elem*sizeof(float));
  gpu_device.memcpyDeviceToHost(full_prec.data(), d_res_float, num_elem*sizeof(float));

  for (int i = 0; i < size; ++i) {
    VERIFY_IS_APPROX(full_prec(i), half_prec(i));
  }


  Tensor<float, 1> full_prec(num_elem);
  gpu_device.memcpyDeviceToHost(half_prec.data(), d_res_half, num_elem*sizeof(float));
  gpu_device.memcpyDeviceToHost(full_prec.data(), d_res_float, num_elem*sizeof(float));
  gpu_device.synchronize();

  for (int i = 0; i < num_elem; ++i) {
    std::cout << "Checking elemwise " << i << std::endl;
    VERIFY_IS_APPROX(full_prec(i), half_prec(i));
  }

