library("clrng")
This example table is small in dimension and size of values. We do the simulation on GPU just for demonstration and test, don’t really need a simulation.. See more tests on real data examples on section 4 of the paper “Ruoyong Xu, Patrick Brown, Pierre L’Ecuyer (2021). A tool set for random number generation on GPUs in R.”
TeaTasting <-matrix(c(3, 1, 1, 3),nrow=2)
TeaTasting
## [,1] [,2]
## [1,] 3 1
## [2,] 1 3
## using R's fisher.test()
fisher.test(TeaTasting)$p.value
## [1] 0.4857143
if (detectGPUs()) {
setContext(grep("gpu", listContexts()$device_type)[1])
## get current device name
gpuInfo()$deviceName
## using clrng's fisher.sim()
## check the size of work items and GPU precision type at the moment
getOption('clrng.Nglobal')
getOption('clrng.type')
## convert the data table to be on GPU
TeaTastingGpu<-gpuR::vclMatrix(TeaTasting,type="integer")
## choose the size of Nglobal and create 16*64 streams
options(clrng.Nglobal=c(16,64))
streams <- gpuR::vclMatrix(clrng::createStreamsCpu())
## perform 100000 fisher's simulation on GPU and return all test statistics
result<-clrng::fisher.sim(TeaTastingGpu, N=1e5, streams=streams,returnStatistics=TRUE)
print(result)
## show some simulation results
result$threshold
as.vector(result$sim)[10:20]
length(result$sim)
} else {
message("No GPU detected. Skipping GPU-dependent code.")
}
##
## Fisher's Exact Test for Count Data with simulated p-value (based on
## 100352 replicates)
##
## data: TeaTastingGpu
## p-value = 0.4879
## [1] 100352