How about the per iteration latency? If you feed the same batch size to each DDP instance (i.e., different global batch_size), is using 4 GPU still faster? Please use the elapsed_time API to measure that.
As DDP uses all_reduce to communicate gradients, GPU utilization cannot faithfully represent how busy a GPU is. CUDA would report 100% GPU utilization even if one GPU is block waiting for another peer to join and doing nothing.