 
 
 ////////////////////////////////////////////////////////////////////////////////////
-// Optimization 4 -- Kernel Splitting + Fuel or Not-Fuel Lookups + Fuel or Not_fuel
-//                   Pre-Sort
-////////////////////////////////////////////////////////////////////////////////////
-// This optimization builds on optimization 3, adding in a "fuel/other" sort before
+// Optimization 4 -- Kernel Splitting + All Material Lookups + Full Sort
+////////////////////////////////////////////////////////////////////////////////////
+// This optimization builds on optimization 2, adding in a full sort before
 // hand so that the warps should be densely packed together. This should maximize
 // SIMD efficiency of the kernel, but may incur an added cost for the sort.
 ////////////////////////////////////////////////////////////////////////////////////
 unsigned long long run_event_based_simulation_optimization_4(Inputs in, SimulationData GSD, int mype)
 {
-	char * optimization_name = "Optimization 4 - Fuel or Other Lookup Kernels + Full Sort";
+	char * optimization_name = "Optimization 4 - All Material Lookup Kernels + Full Sort";
 	
 	if( mype == 0)	printf("Simulation Kernel:\"%s\"\n", optimization_name);
 	

	gpuErrchk( cudaDeviceSynchronize() );

	// Count the number of fuel material lookups that need to be performed (fuel id = 0)
	int n_fuel_lookups = thrust::count(thrust::device, GSD.mat_samples, GSD.mat_samples + in.lookups, 0);
	printf("Going to perform %d fuel lookups...\n", n_fuel_lookups);

	// Launch all material kernels individually (asynchronous is allowed)
	xs_lookup_kernel_optimization_4<<<nblocks, nthreads>>>( in, GSD, 1 );
	xs_lookup_kernel_optimization_4<<<nblocks, nthreads>>>( in, GSD, 0 );
	gpuErrchk( cudaPeekAtLastError() );
	gpuErrchk( cudaDeviceSynchronize() );
	
	////////////////////////////////////////////////////////////////////////////////
	// Reduce Verification Results

	return verification_scalar;
}

__global__ void xs_lookup_kernel_optimization_4(Inputs in, SimulationData GSD, int m )
{
	// The lookup ID. Used to set the seed, and to store the verification value
	const int i = blockIdx.x *blockDim.x + threadIdx.x;
