OK, let the reader beware, that if I'm not outside the boundary of my skillset here, I'm uncomfortably close to that boundary. But it may be that you can use the array modifier to achieve what you want to do. I think the process would be to copy of the top row of vertices of your cylinder, using CTRL-D, make the copy a separate object using the P key, and then convert that object to a curve using ALT-C. I would then select the smallest face of your cylinder, copy it and make it a separate object as with the top vertices. Then assign an array modifier to the object created from the smallest face, setting the fit type to "fit curve", and show the target curve as the one created from the vertices of the top of your mesh, and adjusting the other parameters of the modifier, and perhaps the width of the face as needed to fit the curve. Neil Hirsig's video tutorial on the array modifier may be useful here.
[NOTE TO FUTURE READERS: Neil Hirsig is taking down his website in May, 2017, and I'm not sure how long the link to this video tutorial will be active, but I expect that the video tutorials will continue to be available, perhaps on another site.]