             cudaEventSynchronize( stop );
             cudaEventElapsedTime( &time, start, stop );
 
-            fprintf(stderr, "  backtracking (20,0,0)... done: %.1fms, A/s: %.2f M\n", time, reads_data_cuda.size()/(time*1000.0f) );
+            fprintf(stderr, "  gpu backtracking (20,0,0)... done: %.1fms, A/s: %.3f M\n", time, reads_data_cuda.size()/(time*1000.0f) );
+        }
+        {
+            Timer timer;
+            timer.start();
+
+            uint32 counter = 0;
+            for (uint32 i = 0; i < reads_data->size(); ++i)
+            {
+                count_core(
+                    i,
+                    host_reads_view,
+                    host_fmindex,
+                    20u,
+                    0u,
+                    0u,
+                    &counter );
+            }
+
+            timer.stop();
+            float time = timer.seconds() * 1000.0f;
+
+            fprintf(stderr, "  cpu backtracking (20,0,0)... done: %.1fms, A/s: %.3f M\n", time, reads_data_cuda.size()/(time*1000.0f) );
         }
         // 32-mers, distance=1
         {

    io::FMIndexDataRAM fmi;
    if (fmi.load( index_file, io::FMIndexData::FORWARD ))
    {
        io::FMIndexDataCUDA fmi_cuda( fmi, io::FMIndexDataCUDA::FORWARD );

        typedef PackedStream<io::FMIndexLdgIterators::bwt_type,uint8,2u,true> bwt_type;
        typedef rank_dictionary<2u,

    if (thread_id >= reads.size())
        return;

    count_core( thread_id, reads, fmi, len, seed, mismatches, count );
}

//
