 //==============================================================================
 //==============================================================================
 // stub
-#define MAX_ADJ_UNIONS_BINS 4
+#define MAX_ADJ_UNIONS_BINS 6
 namespace adj_unions {
     struct queue_info {
         unsigned long long queue_sizes[MAX_ADJ_UNIONS_BINS] = {0,};
         vid_t *d_queues[MAX_ADJ_UNIONS_BINS] = {NULL,};
         unsigned long long queue_pos[MAX_ADJ_UNIONS_BINS] = {0,};
-        int queue_threads_per[MAX_ADJ_UNIONS_BINS] = {32, 64, 128, 256};
+        int queue_threads_per[MAX_ADJ_UNIONS_BINS] = {32, 64, 128, 256, 512, 1024};
     };
 
     struct bin_edges {

            if (src.id() >= dst.id()) return; // imposes ordering
            degree_t src_len = dst.degree();
            degree_t dst_len = dst.degree();
            int i = 3;
            
            total_work = src_len + dst_len - 1;
            int W;
            while (i > 0) {

    using namespace adj_union;
    auto       id = blockIdx.x * blockDim.x + threadIdx.x;
    auto queue_id = id / threads_per_union;
    auto block_union_offset = blockIdx.x % ((threads_per_union+blockDim.x-1) / blockDim.x); // > 1 if threads_per_union > block size
    auto thread_union_id = ((block_union_offset*blockDim.x)+threadIdx.x) % threads_per_union;
    auto stride = blockDim.x * gridDim.x;
    auto queue_stride = stride / threads_per_union;
    for (auto i = queue_id; i < size; i += queue_stride) {
