[petsc-users] Performance with GPU and multiple MPI processes per GPU

Gabriele Penazzi Gabriele.Penazzi at synopsys.com
Thu Jan 22 09:21:02 CST 2026


Hi Junchao,

I am already using MPS, but thanks for the suggestion.
It does make a large difference indeed, I think in general it'd be a very useful documentation entry

Thank you,
Gabriele

________________________________
From: Junchao Zhang <junchao.zhang at gmail.com>
Sent: Tuesday, January 20, 2026 5:17 PM
To: Gabriele Penazzi <Gabriele.Penazzi at synopsys.com>
Cc: petsc-users at mcs.anl.gov <petsc-users at mcs.anl.gov>
Subject: Re: [petsc-users] Performance with GPU and multiple MPI processes per GPU

Hello Babriele,
  Maybe you can try CUDA MPS service, to effectively map multiple processes to one GPU.  First, I would create a directory $HOME/tmp/nvidia-mps  (by default, cuda will use /tmp/nvidia-mps), then use these steps

export CUDA_MPS_PIPE_DIRECTORY=$HOME/tmp/nvidia-mps
export CUDA_MPS_LOG_DIRECTORY=$HOME/tmp/nvidia-mps

# Start MPS
nvidia-cuda-mps-control -d

# run the test
mpiexec -n 16 ./test

# shut down MPS
echo quit | nvidia-cuda-mps-control

I would also like to block-map MPI processes to GPUs manually via manipulating the env var CUDA_VISIBLE_DEVICES.   So I have this bash script set_gpu_device.sh on my PATH (assume you use OpenMPI)

#!/bin/bash
GPUS_PER_NODE=2
export CUDA_VISIBLE_DEVICES=$((OMPI_COMM_WORLD_LOCAL_RANK/(OMPI_COMM_WORLD_LOCAL_SIZE/GPUS_PER_NODE)))
exec $*

In other words, to run the test, I use

mpiexec -n 16 set_gpu_device.sh ./test

Let us know if it helps so that we can add the instructions to the PETSc doc.

Thanks.
--Junchao Zhang


On Tue, Jan 20, 2026 at 8:21 AM Gabriele Penazzi via petsc-users <petsc-users at mcs.anl.gov<mailto:petsc-users at mcs.anl.gov>> wrote:
Hi.

I am using PETSc conjugate gradient liner solver with GPU acceleration (CUDA), on multiple GPUs and multiple MPI processes.

I noticed that the performances degrade significantly when using multiple MPI processes per GPU, compared to using a single process per GPU.
For example, 2 GPUs with 2 MPI processes will be about 40% faster than running the same calculation with 2 GPUs and 16 MPI processes.

I would assume the natural MPI/GPU affinity would be 1-1, however the rest of my application can benefit from multiple MPI processes driving GPU via nvidia MPS, therefore I am trying to understand if this is expected, if I am possibly missing something in the initialization/setup, or if my best choice is to constrain 1-1 MPI/GPU access especially for the PETSc linear solver step. I could not find explicit information about it in the manual.

Is there any user or maintainer who can tell me more about this use case?

Best Regards,
Gabriele Penazzi





-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20260122/d7bf8115/attachment.html>


More information about the petsc-users mailing list