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.
function | equivalent R function | description |
---|---|---|
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 | |
gpuCor | cor with use="pairwisecomplete" | calculation correlation coefficients |
gpuCrossprod | matrix cross-product | |
gpuDist | dist | compute distances between vectors |
gpuDistClust | hClust | compute distances and hierarchical clustering |
gpuGlm | glm, lm, loglin | fitting generalised linear models using QR decomposition |
gpuGranger | Granger Causality Tests | |
gpuHclust | hclust | clustering 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