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
, multiple selections available,