I realize this may all change if we go with non-specialized threads.  If we don't I think this function needs a decent sized comment.  It took me a while to realize that the only reason it works is because sum_ops(read) should only have non-zero values when summing the read_threads.  It surprised me that we were summing ops in all threads.  Right now do you expect the wrong thread type to have operations of other types?  If not, I'd move each of these loops into their respective sum_<type>_ops function instead.