Um noch ein bisschen mehr zu klugscheißen: Ich sehe ein, dass es mit multi-gpu alles etwas komplizierter wird, aber da sollten sich eigentlich Treiber und Hardware um die meisten Dinge kümmern. Meistens ist es aber so, dass wenn es tatsächlich mal außer beim Buffer Swap vorkommt, dass die CPU auf die GPU warten muss man etwas falsch macht, denn wirklich gerechtfertigt ist es fast nie. Das Beispiel mit dem Gaussian Blur verstehe ich nicht, denn da hat die Grafikkarte doch das original Bild, rendert mit horizontalem Blur in eine neue Textur und rendert das mit vertikalem Blur entweder wieder in die erste oder noch eine neue Textur. Dabei bleibt das aber alles auf der Grafikkarte und die CPU muss auf nichts warten.
Occlusion culling ist tatsächlich problematisch, aber genau aus diesem Grund wird es in richtigen Anwendungen dann auch nicht so naiv implementiert, denn dann wäre es meistens deutlich langsamer als ohne. Meistens ist der Ansatz bei solchen Problemen, asynchron zu die Daten zurück zu bekommen, mit dem Nachteil, dass die Daten dann mindestens einen Frame hinterher hängen, was man dann wenn nötig wieder versuchen kann auszugleichen.