Splitting a frame is called “bucket rendering” By default blender doesn’t have it but you can “trick it” using the border renders.
issue is that at the end you have to combine the individual “buckets” into a single image. I bet its duable via command lines as well, as it is simply compositing x amount of parts of a single frame into single image.
Still best approach (being the most efficient on single sistem)
In blender scene set “placeholders” on, and disable “overwrite” in the "overwride window.
launch identicial amount of blender instances as GPU’s. (note each instance would have to be pointed to individual GPU).
as all would be pointed to the same folder, and upon starting a frame render it creates a temporary “placeholder” image. the second instace would Not be able to render that image, and would automatically start rendering the second image. Third would start Third, and so on.
If first one finishes it would automatically start next, but can’t so ti will try until it does not find a placeholder image.
The only “loss” is towards the end of the animation. eg. if you have 5 GPU’s so the last 4 would be an area when GPU’s would be idle.