 	}
 
 #else
-
 	for(int d = NUM_THREADS/2; d > 32; d >>= 1)
 	{
 		__syncthreads();
-
+		
 		if (idx < d)
 		{
 			float err0 = errors[idx];
 			float err1 = errors[idx + d];
-
+			
 			if (err1 < err0) {
 				errors[idx] = err1;
 				indices[idx] = indices[idx + d];

	if (tid > 12 && cmp[tid] == cmp[12]) ++cmp[tid];
	if (tid > 13 && cmp[tid] == cmp[13]) ++cmp[tid];
	if (tid > 14 && cmp[tid] == cmp[14]) ++cmp[tid];

	float3 tmp = colors[tid];
	colors[cmp[tid]] = tmp;
}

__device__ void sortColors(float * values, float3 * colors, float * weights, int * cmp)
{
	int tid = threadIdx.x;

	cmp[tid] = (values[0] < values[tid]);
	cmp[tid] += (values[1] < values[tid]);
	cmp[tid] += (values[2] < values[tid]);
	cmp[tid] += (values[3] < values[tid]);
	cmp[tid] += (values[4] < values[tid]);
	cmp[tid] += (values[5] < values[tid]);
	cmp[tid] += (values[6] < values[tid]);
	cmp[tid] += (values[7] < values[tid]);
	cmp[tid] += (values[8] < values[tid]);
	cmp[tid] += (values[9] < values[tid]);
	cmp[tid] += (values[10] < values[tid]);
	cmp[tid] += (values[11] < values[tid]);
	cmp[tid] += (values[12] < values[tid]);
	cmp[tid] += (values[13] < values[tid]);
	cmp[tid] += (values[14] < values[tid]);
	cmp[tid] += (values[15] < values[tid]);
	
	// Resolve elements with the same index.
	if (tid > 0 && cmp[tid] == cmp[0]) ++cmp[tid];
	if (tid > 1 && cmp[tid] == cmp[1]) ++cmp[tid];
	if (tid > 2 && cmp[tid] == cmp[2]) ++cmp[tid];
	if (tid > 3 && cmp[tid] == cmp[3]) ++cmp[tid];
	if (tid > 4 && cmp[tid] == cmp[4]) ++cmp[tid];
	if (tid > 5 && cmp[tid] == cmp[5]) ++cmp[tid];
	if (tid > 6 && cmp[tid] == cmp[6]) ++cmp[tid];
	if (tid > 7 && cmp[tid] == cmp[7]) ++cmp[tid];
	if (tid > 8 && cmp[tid] == cmp[8]) ++cmp[tid];
	if (tid > 9 && cmp[tid] == cmp[9]) ++cmp[tid];
	if (tid > 10 && cmp[tid] == cmp[10]) ++cmp[tid];
	if (tid > 11 && cmp[tid] == cmp[11]) ++cmp[tid];
	if (tid > 12 && cmp[tid] == cmp[12]) ++cmp[tid];
	if (tid > 13 && cmp[tid] == cmp[13]) ++cmp[tid];
	if (tid > 14 && cmp[tid] == cmp[14]) ++cmp[tid];

	float3 tmp = colors[tid];
	colors[cmp[tid]] = tmp;

	weights[cmp[tid]] = weights[tid];
}





////////////////////////////////////////////////////////////////////////////////
// Load color block to shared mem
////////////////////////////////////////////////////////////////////////////////
__device__ void loadColorBlock(const uint * image, float3 colors[16], int xrefs[16])
{
	const int bid = blockIdx.x;
	const int idx = threadIdx.x;

	__shared__ float dps[16];

	if (idx < 16)
	{
		// Read color and copy to shared mem.
