I've build a very very basic particle simulation, similar to what I did with the grass for Bounty Road
The idea is to have each particle represented by a pixel in a render target (in the grass example this is not the case!) and solve spring equations for each pixel in this rendertarget.
In the image above i used 128x80 particles, so that's the size of the rendertarget, too.
I need to have 2 of the rendertargets so they can read from each other. The active rendertarget is switched each frame for this reason. Obviously this is a limitation of using pixel shaders, but I'm fine with that.
The simulation runs at ~2500fps, but I think the limiting factor is something else at that point.
For what it's worth it still runs with 500 fps with 1280x800 (over a million) particles. At that point I have massive overdraw though, so that's a thing to consider.