Here is a sample template for submitting your program to one of the GPU compute nodes:

#!/bin/bash -l
# Name your job (used in the PBS output file names)
#PBS -N GPUTEST
# Specify the gpuq queue
#PBS -q gpuq
# Specify the number of gpus
#PBS -l nodes=1:ppn=1:gpus=1
# Specify the gpu feature
#PBS -l feature=gpu
# Specify your resource account (use qr command to determine)
#PBS -A Physics
# Specify how much time you think the job will run
#PBS -l walltime=00:15:00
# Have the job send you email when the job ends or aborts
#PBS -M john.doe@dartmouth.edu
#PBS -m ea
# Join error and standard output into one file
#PBS -j oe 
# Change to the directory that the job was submitted from
cd $PBS_O_WORKDIR
# Parse the PBS_GPUFILE to determine which GPU you have been assigned
# and unset CUDA_VISIBLE_DEVICES
gpuNum=`cat $PBS_GPUFILE | sed -e 's/.*-gpu//g'`
unset CUDA_VISIBLE_DEVICES
# if using PyCUDA set the CUDA_DEVICE environment variable
export CUDA_DEVICE=$gpuNum
# Pass the GPU number as an argument to your program
program_name $gpuNum
exit 0

Your program needs to know which GPU it has been assigned and the submission template above parses the contents of the file given in the envrironment variable PBS_GPUFILE to determine which GPU number your job has been assigned.  You should pass the GPU number to your program as a command line argument and then set the default GPU in your code.  See this page on command line arguments for examples on how to read a command line argument in C/C++,Fortran and matlab. If you are using PyCUDA, set the environment variable CUDA_DEVICE to the GPU number as shown in the job submission template above.