             uint16_t j1 = read_pos + 2;
             uint16_t j2 = read_pos + 3;
             uint16_t j3 = read_pos + 4;
-            //printf("thread idx %d locations %d %d %d %d\n", thread_idx, j0, j1, j2, j3);
+            //printf("thread idx %d locations %d %d\n", thread_idx, j0, j1);
             int16_t score0 = max(scores_pred_i_1[j0-1] + char_profile0,
                     scores_pred_i_1[j0] + GAP);
             int16_t score1 = max(scores_pred_i_1[j1-1] + char_profile1,


    long long int serial = 0;

    // Run DP loop for calculating scores. Process each row at a time, and
    // compute vertical and diagonal values in parallel.
    for(uint16_t graph_pos = 0; graph_pos < graph_count; graph_pos++)

        uint8_t n = nodes[node_id];

        //int16_t prev_score = init_score;
        //if (thread_idx == 0)
        //{
        //    prev_score[0] = init_score;
        //}

        //__syncthreads();

        // max_cols is the first warp boundary multiple beyond read_count. This is done
        // so all threads in the warp enter the loop.
        for(uint16_t read_pos = thread_idx * m; read_pos < max_cols; read_pos += blockDim.x * m)
        {
            //printf("updating vertical for pos %d thread %d\n", read_pos, thread_idx);
            int16_t char_profile0 = (n == read[read_pos + 0] ? MATCH : MISMATCH);
