Difference between revisions of "Rocky R Prime"

From NIMBioS
Line 29: Line 29:


registerDoParallel(40)
registerDoParallel(40)
known_primes <-
  c(2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31)
search_space <- 34:999
found_primes <- foreach(check_i= search_space, .combine=c() ) %dopar% {
  if(any((check_i %% known_primes )==0 ) return(list())
  return(list(check_i))
}
write.table(sort(c(known_primes, found_primes)), file="R_prime_serial.txt")


</pre>
</pre>
Line 37: Line 49:


registerDoParallel(40)
registerDoParallel(40)
known_primes <-
  c(2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31)
search_space <- rep(3:99, each=4)*10 + rep(c(1,3,7,9), 97)
found_primes <- foreach(check_i= search_space, .combine=c() ) %dopar% {
  if(any((check_i %% known_primes )==0 ) return(list())
  return(list(check_i))
}
write.table(sort(c(known_primes, found_primes)), file="R_prime_serial.txt")


</pre>
</pre>

Revision as of 20:23, 6 April 2023

Insert example here

Prime Number example code

R serial script

library(foreach)
registerDoSeq()

known_primes <- 
  c(2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31)

search_space <- 34:999

found_primes <- foreach(check_i= search_space, .combine=c() ) %do% {
  if(any((check_i %% known_primes )==0 ) return(list())
  return(list(check_i))
}

write.table(sort(c(known_primes, found_primes)), file="R_prime_serial.txt")

R parallel script

Naive version

library(foreach)
library(doParallel)

registerDoParallel(40)

known_primes <- 
  c(2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31)

search_space <- 34:999

found_primes <- foreach(check_i= search_space, .combine=c() ) %dopar% {
  if(any((check_i %% known_primes )==0 ) return(list())
  return(list(check_i))
}

write.table(sort(c(known_primes, found_primes)), file="R_prime_serial.txt")

Only check numbers ending in 1, 3, 7 and 9

library(foreach)
library(doParallel)

registerDoParallel(40)

known_primes <- 
  c(2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31)

search_space <- rep(3:99, each=4)*10 + rep(c(1,3,7,9), 97)

found_primes <- foreach(check_i= search_space, .combine=c() ) %dopar% {
  if(any((check_i %% known_primes )==0 ) return(list())
  return(list(check_i))
}

write.table(sort(c(known_primes, found_primes)), file="R_prime_serial.txt")

Slurm submission script

#!/bin/bash
#SBATCH --job-name=R_PRIME        ### Job Name
#SBATCH --output=R_prime_%j.out   ### File in which to store job output
#SBATCH --time=00:10:00           ### Wall clock time limit in Days-HH:MM:SS
#SBATCH --nodes=1                 ### Node count required for the job
#SBATCH --ntasks-per-node=1       ### Number of tasks to be launched per Node
#SBATCH --mem-per-cpu=2G

#SBATCH --cpus-per-task=40

module load R/4.2.1-foss-2022a 
date
R --version

time Rscript R_prime_serial.R
date
time Rscript R_prime_parallel.R
date
time Rscript R_prime_parallel_fast.R
date

Running the Prime Number example

Uploading the code

The simple way to see this code is to clone the github repository:

[[ -e ~/git ]]  || mkdir ~/git  # Auto-create git subdirectory
cd ~/git                        # switch to git subdirectory
[[ -e r_prime_cluster ]] || git clone #GITHUB REPO URL
cd r_prime_cluster

Sanity check:

cat BLAH

Submitting the script

sbatch R-prime.srun

Looking at the results

Check the job queue, wait for job completion

squeue

Check log file:

ls -l R_prime_*.out

# just look at the latest output log
cat $( ls -t R_prime_*.out | head -n 1)

Check results file:

# Quick hash check verifying prime number sets are identical
md5sum $( ls -t R_prime_*.txt | head -n 3)