Compare commits
2 Commits
25f0531dcd
...
a5ccd8759c
Author | SHA1 | Date | |
---|---|---|---|
a5ccd8759c | |||
10bb038cdf |
8
.gitignore
vendored
8
.gitignore
vendored
@ -1,4 +1,4 @@
|
|||||||
.Rproj.user
|
**/.Rproj.user
|
||||||
.Rhistory
|
**/.Rhistory
|
||||||
.RData
|
**/.RData
|
||||||
.Ruserdata
|
**/.Ruserdata
|
||||||
|
BIN
w1/README.pdf
Normal file
BIN
w1/README.pdf
Normal file
Binary file not shown.
89
w1/README.rmd
Normal file
89
w1/README.rmd
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
# Comparison between C-implemented and R-implemented dual-loop matrix summing function performance
|
||||||
|
|
||||||
|
## Running
|
||||||
|
|
||||||
|
To run this project, run the following commands:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# matrix test
|
||||||
|
Rscript mat_tests.R
|
||||||
|
```
|
||||||
|
|
||||||
|
### Building and running
|
||||||
|
|
||||||
|
If you edit the C code, to recompile run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bash make_c.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### View Evaluation
|
||||||
|
|
||||||
|
To install packages necessary for this .rmd document, run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
Rscript install_libs.R
|
||||||
|
```
|
||||||
|
|
||||||
|
## Evaluation
|
||||||
|
The experiment shows the performance comparison between the R-implemented and C-implemented matrix summing functions
|
||||||
|
for different matrix sizes. As the matrix size increases, the C-implemented function demonstrates significantly
|
||||||
|
better performance compared to the R-implemented function.
|
||||||
|
Surprisingly, the speedup remains fairly constant in relative terms, stabilizing at about 4x
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
> Note: Evaluation script run on an AMD Ryzen 9 7950X3D cpu with enough RAM for all matrix sizes
|
||||||
|
|
||||||
|
|
||||||
|
| Matrix size | sum1 run duration (secs) | sum2 run duration (secs) |
|
||||||
|
|-------------|---------------------------|---------------------------|
|
||||||
|
| 5x5 | 7.152557e-06 | 7.867813e-06 |
|
||||||
|
| 10x10 | 9.775162e-06 | 5.00679e-06 |
|
||||||
|
| 50x50 | 9.346008e-05 | 8.106232e-06 |
|
||||||
|
| 100x100 | 0.0003376007 | 1.955032e-05 |
|
||||||
|
| 500x500 | 0.007472992 | 0.001415014 |
|
||||||
|
| 1000x1000 | 0.03007007 | 0.005748034 |
|
||||||
|
| 5000x5000 | 0.6559205 | 0.1854615 |
|
||||||
|
| 10000x10000 | 2.692389 | 0.6747584 |
|
||||||
|
| 20000x20000 | 10.67763 | 2.615553 |
|
||||||
|
| 30000x30000 | 24.33534 | 5.987761 |
|
||||||
|
|
||||||
|
```{r diagram}
|
||||||
|
library(ggplot2)
|
||||||
|
library(dplyr)
|
||||||
|
library(tidyr)
|
||||||
|
|
||||||
|
# prepare data
|
||||||
|
data <- tribble(
|
||||||
|
~Matrix.size, ~R.sum, ~C.sum,
|
||||||
|
"5", 7.152557e-06, 7.867813e-06,
|
||||||
|
"10", 9.775162e-06, 5.00679e-06,
|
||||||
|
"50", 9.346008e-05, 8.106232e-06,
|
||||||
|
"100", 0.0003376007, 1.955032e-05,
|
||||||
|
"500", 0.007472992, 0.001415014,
|
||||||
|
"1000", 0.03007007, 0.005748034,
|
||||||
|
"5000", 0.6559205, 0.1854615,
|
||||||
|
"10000", 2.692389, 0.6747584,
|
||||||
|
"20000", 10.67763, 2.615553,
|
||||||
|
"30000", 24.33534, 5.987761
|
||||||
|
)
|
||||||
|
|
||||||
|
# Convert Matrix.size to factor with desired order
|
||||||
|
data$Matrix.size <- factor(data$Matrix.size, levels = data$Matrix.size)
|
||||||
|
|
||||||
|
# rearrange data
|
||||||
|
data_long <- data %>%
|
||||||
|
pivot_longer(cols = c(R.sum, C.sum),
|
||||||
|
names_to = "Method",
|
||||||
|
values_to = "Duration")
|
||||||
|
|
||||||
|
# Create the plot
|
||||||
|
ggplot(data_long, aes(x = Matrix.size, y = Duration, color = Method)) +
|
||||||
|
geom_point() +
|
||||||
|
scale_y_log10() +
|
||||||
|
labs(x = "Matrix Size", y = "Duration (seconds)", color = "Method") +
|
||||||
|
ggtitle("Calculation Time per (square) matrix size") +
|
||||||
|
theme_minimal()
|
||||||
|
```
|
4
w1/install_libs.R
Normal file
4
w1/install_libs.R
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
install.packages("rmarkdown")
|
||||||
|
install.packages("ggplot2")
|
||||||
|
install.packages("dplyr")
|
||||||
|
install.packages("tidyr")
|
1
w1/make_c.sh
Normal file
1
w1/make_c.sh
Normal file
@ -0,0 +1 @@
|
|||||||
|
R CMD SHLIB mat.c
|
19
w1/mat.R
Normal file
19
w1/mat.R
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
dyn.load("mat.so")
|
||||||
|
|
||||||
|
|
||||||
|
sum1 <- function(matrix) {
|
||||||
|
result <- 0
|
||||||
|
for (i in seq_len(nrow(matrix))) {
|
||||||
|
for (j in seq_len(ncol(matrix))) {
|
||||||
|
result <- result + matrix[i, j]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return(result)
|
||||||
|
}
|
||||||
|
|
||||||
|
sum2 <- function(matrix) {
|
||||||
|
nrow <- nrow(matrix)
|
||||||
|
ncol <- ncol(matrix)
|
||||||
|
result <- .C("c_sum_matrix", as.double(matrix), as.integer(nrow), as.integer(ncol), result = double(1))$result
|
||||||
|
return(result)
|
||||||
|
}
|
12
w1/mat.c
Normal file
12
w1/mat.c
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
#include <R.h>
|
||||||
|
#include <Rinternals.h>
|
||||||
|
|
||||||
|
void c_sum_matrix(double *matrix, int *nrow, int *ncol, double *result) {
|
||||||
|
int i, j;
|
||||||
|
*result = 0.0;
|
||||||
|
for (i = 0; i < *nrow; i++) {
|
||||||
|
for (j = 0; j < *ncol; j++) {
|
||||||
|
*result += matrix[i * (*ncol) + j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
32
w1/mat_tests.R
Normal file
32
w1/mat_tests.R
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
source("mat.R")
|
||||||
|
|
||||||
|
time <- function(f) {
|
||||||
|
start_time <- Sys.time()
|
||||||
|
val <- f()
|
||||||
|
end_time <- Sys.time()
|
||||||
|
print(end_time - start_time)
|
||||||
|
return(val)
|
||||||
|
}
|
||||||
|
|
||||||
|
sizes <- c(5, 10, 50, 100, 500, 1000, 5000, 10000, 20000, 30000)
|
||||||
|
# sizes <- c(5, 10, 50, 100, 500, 1000, 5000, 10000)
|
||||||
|
|
||||||
|
# warm up
|
||||||
|
|
||||||
|
for (size in 30:50) {
|
||||||
|
m <- matrix(runif(size * size), nrow = size, ncol = size)
|
||||||
|
sum1(m)
|
||||||
|
sum2(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size in sizes) {
|
||||||
|
m <- matrix(runif(size * size), nrow = size, ncol = size)
|
||||||
|
|
||||||
|
cat(sprintf("Matrix size: %dx%d\n", size, size))
|
||||||
|
cat("sum1 run duration: ")
|
||||||
|
time(function() sum1(m))
|
||||||
|
cat("sum2 run duration: ")
|
||||||
|
time(function() sum2(m))
|
||||||
|
cat("\n")
|
||||||
|
}
|
||||||
|
|
BIN
w1/w1_yannik-bretschneider_evoalgs-practise.zip
Normal file
BIN
w1/w1_yannik-bretschneider_evoalgs-practise.zip
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user