             }
             else
             {
-                // Unweight the first-output if it's the same row as the carry aggregate
-                PartialSum first_scatter = temp_storage.first_scatter;
-                if (first_scatter.row == carry.running_prefix.row)
-                    first_scatter.partial = Value(0);
-
-                // Write out threadblock first-item and carry aggregate
+                // Write out threadblock first-scattered-item and running total
+                PartialSum first_scatter;
+                first_scatter.row       = temp_storage.first_block_row;
+                first_scatter.partial   = temp_storage.first_scatter_partial;
+
                 d_block_partials[blockIdx.x * 2]          = first_scatter;
                 d_block_partials[(blockIdx.x * 2) + 1]    = carry.running_prefix;
             }

        if (threadIdx.x == 0)
        {
            VertexId first_block_row            = d_rows[block_offset];
            last_block_row                      = d_rows[block_oob - 1];

            // Initialize carry to identity
            carry.running_prefix.row            = first_block_row;
            carry.running_prefix.partial        = Value(0);
            temp_storage.identity               = carry.running_prefix;

            temp_storage.first_scatter.row      = last_block_row;
            temp_storage.first_scatter.partial  = Value(0);
            temp_storage.last_block_row         = last_block_row;
        }

        __syncthreads();

        last_block_row = temp_storage.last_block_row;
    }



    Value                           *d_vector;
    Value                           *d_result;
    PartialSum                      *d_block_partials;


    /**
