5) GPGPU Computing

YARCC has a number of NVidia GPGPU nodes which are documented in  /wiki/spaces/RHPC/pages/25101677.

Access to the GPGPU cards is easily done through the 'gputools' package. You need to load the module "cuda" to use the package.

Package 'gputools'

gputools provides R interfaces to a number of common functions implemented using the NVidia CUDA language and toolkit.

functionequivalent R functiondescription
chooseGpu select GPU device to perform calculations
cpuMatMult perform matrix multiplication using R's BLAS library
getGpuId queries the GPU driver for the ID of the device being usedfor the computation
gpuCorcor with use="pairwisecomplete"calculation correlation coefficients
gpuCrossprod matrix cross-product
gpuDistdistcompute distances between vectors
gpuDistClusthClustcompute distances and hierarchical clustering
gpuGlm

glm, lm, loglin

fitting generalised linear models using QR decomposition
gpuGranger Granger Causality Tests
gpuHclusthclustclustering on a set ofpoints
gpuLm fitting linear models
gpuLm.defaultTol switch tolerance depending on precision
gpuLm.fit fitter function for linear models
gpuLs.fit least sqares fit using QR decomposition
gpuMatMult perform matrix multiplication
gpuMi B spline based mutual information
gpuQr estimate the QR decomposition for a matrix
gpuSolve estimate the solution to a matrix vector equation
gpuTcrossprod perform matrix transposed cross-product
gpuTtest T-Test Estimator

More detailed information on using the package can be found here: gputools documentation

Example YARCC jobs using 'gputools'

Example GPGPU R script
require(gputools)

test.gpuCrossprod <- function(x, y)
{
  matA <- matrix(runif(x*y), x, y);
  matB <- matrix(runif(x*y), x, y);
  print(sprintf("Using GPU: %s for gpuCrossprod test", getGpuId()));
  system.time(gpuCrossprod(matA, matB), TRUE);
}
test.cpuCrossprod <- function(x, y)
{
  matA <- matrix(runif(x*y), x, y);
  matB <- matrix(runif(x*y), x, y);
  print("Using CPU for cpuCrossprod test");
  system.time(crossprod(matA, matB), TRUE);
}
print("Testing GPU")
test.gpuCrossprod(3000,4000)
test.cpuCrossprod(3000,4000)
GPGPU Job Script
#$ -cwd -V
#$ -l h_rt=0:15:00
#$ -o logs
#$ -e logs
#$ -N gpu_test
#$ -l nvidia_k40=1

echo `date`: executing gputools R module on host ${HOSTNAME} with ${NSLOTS} slots
/usr/bin/nvidia-smi --list-gpus
R CMD BATCH --no-save gpu-test.R output/gpu-test.Rout
Performance of GPGPU test
> print("Testing GPU")
[1] "Testing GPU"
>
> test.gpuCrossprod(3000,4000)
[1] "Using GPU: 0 for gpuCrossprod test"
   user  system elapsed
  0.573   0.458   1.048
> test.cpuCrossprod(3000,4000)
[1] "Using CPU for cpuCrossprod test"
   user  system elapsed
131.222   0.092 131.170
>
>
> proc.time()
   user  system elapsed
135.548   0.901 136.414