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
Â
Â
Â