             int METHOD = (WORK_FACTOR*intersect_work >= binary_work_est);
             int log_work = METHOD ? 32-__clz(binary_work): 32-__clz(intersect_work);
 
-            bin_index = (METHOD*MAX_ADJ_UNIONS_BINS/2)+log_work; 
+            bin_index = (METHOD*MAX_ADJ_UNIONS_BINS/2)+(log_work*BINS_1D_DIM+log_v); 
             //bin_index = MAX_ADJ_UNIONS_BINS/2+((src.id() + dst.id())%(MAX_ADJ_UNIONS_BINS/2));
             //bin_index = MAX_ADJ_UNIONS_BINS/2;
 

    const int LOG_OFFSET = 3; // seems optimal from testing a few inputs; tunable
    int log_factor = LOG_OFFSET; 
    // balanced kernel
    while (bin_offset+log_factor <= MAX_ADJ_UNIONS_BINS/2) {
        threads_per = 1 << (log_factor - LOG_OFFSET); 
        bin_index = bin_offset+log_factor;
        //std::cout << "bin_index " << bin_index << std::endl;
        end_index = queue_pos[bin_index];
        size = end_index - start_index;

        start_index = end_index;
        log_factor += 1;
    }
    // imbalanced kernel 
    bin_offset = MAX_ADJ_UNIONS_BINS/2;
    log_factor = LOG_OFFSET;
    while (bin_offset+(log_factor*BINS_1D_DIM) <= MAX_ADJ_UNIONS_BINS) {
        threads_per = 1 << (log_factor - LOG_OFFSET); 
        bin_index = bin_offset+(log_factor*BINS_1D_DIM);
        //std::cout << "bin_index " << bin_index << std::endl;
        end_index = queue_pos[bin_index];
        size = end_index - start_index;
