                 genome_begin,
                 d_genome,
                 stats );
+
+            log_verbose(stderr, "\r  aligned %5.2f%% of genome", 100.0f * float( genome_end ) / float( genome_len ));
         }
+        log_verbose_cont(stderr, "\n");
 
         cudaDeviceSynchronize();
         timer.stop();
         const float time = timer.seconds();
 
+        // accumulate the number of aligned reads
+        stats.reads += d_read_data.size();
+
         log_info(stderr, "  aligned reads:\n");
         log_info(stderr, "    %6.2f M reads/s\n", (1.0e-6f * float( stats.reads )) / time );
+        log_verbose(stderr, "    breakdown:\n");
+        log_verbose(stderr, "      extract throughput : %.2f B q-grams/s\n", (1.0e-9f * float( stats.queries )) / stats.extract_time);
+        log_verbose(stderr, "      rank throughput    : %6.2f K reads/s\n", (1.0e-3f * float( stats.reads )) / stats.rank_time);
+        log_verbose(stderr, "      locate throughput  : %6.2f K reads/s\n", (1.0e-3f * float( stats.reads )) / stats.locate_time);
+        log_verbose(stderr, "      align throughput   : %6.2f K reads/s\n", (1.0e-3f * float( stats.reads )) / stats.align_time);
+        log_verbose(stderr, "                         : %6.2f M hits/s\n",  (1.0e-6f * float( stats.merged )) / stats.align_time);
+        log_verbose(stderr, "      matches            : %.2f M\n", 1.0e-6f * float( stats.matches ) );
+        log_verbose(stderr, "      occurrences        : %.3f B\n", 1.0e-9f * float( stats.occurrences ) );
+        log_verbose(stderr, "      merged occurrences : %.3f B (%.1f %%)\n", 1.0e-9f * float( stats.merged ), 100.0f * float(stats.merged)/float(stats.occurrences));
     }
     return 0;
 }

    timer.stop();
    const float extract_time = timer.seconds();

    stats.reads         += reads.size();
    stats.queries       += n_queries;
    stats.extract_time  += extract_time;


        timer.stop();
        stats.align_time += timer.seconds();
    }
}

// main test entry point
