AddOne OMP Timings

local({
    tmpdir <- tempdir()
    year <- 2023
    tarball <- "AddOne_4.0-2.tar.gz"
    path <- sprintf("classes/STAT7400-%s/examples/%s", year, tarball)
    url <- sprintf("http://www.stat.uiowa.edu/~luke/%s", path)
    download.file(url, file.path(tmpdir, tarball))
    dir.create(file.path(tmpdir, "lib"))
    .libPaths(c(file.path(tmpdir, "lib"), .libPaths()))
    install.packages(file.path(tmpdir, tarball), repos = NULL)
})

library(AddOne)
    
R <- 100000
K <- 3
threads <- c(1, 2, 4)
if (isTRUE(parallel::detectCores() > 4))
    threads <- c(1, 2, 4, 8)
lens <- c(8, 32, 64, 128, 256, 512, 1024, 2048)

n <- rep(rep(lens, length(threads)), K)
P <- rep(rep(threads, each = length(lens)), K)

tm <- function(n, P) {
    x <- rnorm(n)
    system.time(for (i in 1 : R) p.AddOne(x, P = P))[3]
}

system.time(time <- sapply(seq_along(n), function(i) tm(n[i], P[i])))

d <- data.frame(time, n, P = as.factor(P))

library(ggplot2)
ggplot(d, aes(n, time, color = P)) + geom_point() + geom_smooth()
LS0tCnRpdGxlOiAiSFc3IE5vdGVzIgphdXRob3I6ICJMdWtlIFRpZXJuZXkiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKLS0tCgpgYGB7ciBnbG9iYWxfb3B0aW9ucywgaW5jbHVkZSA9IEZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoY29sbGFwc2UgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgY2xhc3Muc291cmNlID0gImZvbGQtc2hvdyIsCiAgICAgICAgICAgICAgICAgICAgICBmaWcuYWxpZ24gPSAiY2VudGVyIikKc2V0LnNlZWQoMjAyMS0wMy0xOSkKYGBgCgojIyBBZGRPbmUgT01QIFRpbWluZ3MKCmBgYHtyLCBldmFsID0gRkFMU0V9CmxvY2FsKHsKICAgIHRtcGRpciA8LSB0ZW1wZGlyKCkKICAgIHllYXIgPC0gMjAyMwogICAgdGFyYmFsbCA8LSAiQWRkT25lXzQuMC0yLnRhci5neiIKICAgIHBhdGggPC0gc3ByaW50ZigiY2xhc3Nlcy9TVEFUNzQwMC0lcy9leGFtcGxlcy8lcyIsIHllYXIsIHRhcmJhbGwpCiAgICB1cmwgPC0gc3ByaW50ZigiaHR0cDovL3d3dy5zdGF0LnVpb3dhLmVkdS9+bHVrZS8lcyIsIHBhdGgpCiAgICBkb3dubG9hZC5maWxlKHVybCwgZmlsZS5wYXRoKHRtcGRpciwgdGFyYmFsbCkpCiAgICBkaXIuY3JlYXRlKGZpbGUucGF0aCh0bXBkaXIsICJsaWIiKSkKICAgIC5saWJQYXRocyhjKGZpbGUucGF0aCh0bXBkaXIsICJsaWIiKSwgLmxpYlBhdGhzKCkpKQogICAgaW5zdGFsbC5wYWNrYWdlcyhmaWxlLnBhdGgodG1wZGlyLCB0YXJiYWxsKSwgcmVwb3MgPSBOVUxMKQp9KQoKbGlicmFyeShBZGRPbmUpCgkKUiA8LSAxMDAwMDAKSyA8LSAzCnRocmVhZHMgPC0gYygxLCAyLCA0KQppZiAoaXNUUlVFKHBhcmFsbGVsOjpkZXRlY3RDb3JlcygpID4gNCkpCgl0aHJlYWRzIDwtIGMoMSwgMiwgNCwgOCkKbGVucyA8LSBjKDgsIDMyLCA2NCwgMTI4LCAyNTYsIDUxMiwgMTAyNCwgMjA0OCkKCm4gPC0gcmVwKHJlcChsZW5zLCBsZW5ndGgodGhyZWFkcykpLCBLKQpQIDwtIHJlcChyZXAodGhyZWFkcywgZWFjaCA9IGxlbmd0aChsZW5zKSksIEspCgp0bSA8LSBmdW5jdGlvbihuLCBQKSB7CiAgICB4IDwtIHJub3JtKG4pCiAgICBzeXN0ZW0udGltZShmb3IgKGkgaW4gMSA6IFIpIHAuQWRkT25lKHgsIFAgPSBQKSlbM10KfQoKc3lzdGVtLnRpbWUodGltZSA8LSBzYXBwbHkoc2VxX2Fsb25nKG4pLCBmdW5jdGlvbihpKSB0bShuW2ldLCBQW2ldKSkpCgpkIDwtIGRhdGEuZnJhbWUodGltZSwgbiwgUCA9IGFzLmZhY3RvcihQKSkKCmxpYnJhcnkoZ2dwbG90MikKZ2dwbG90KGQsIGFlcyhuLCB0aW1lLCBjb2xvciA9IFApKSArIGdlb21fcG9pbnQoKSArIGdlb21fc21vb3RoKCkKYGBgCgo8IS0tCiMjIFNpZ25hbGluZyBOYU4gV2FybmluZ3MKClRoZSBjb252ZW50aW9uIGlzIHRvIHNpZ25hbCB0aGUgYCJOYU5zIHByb2R1Y2VkImAgd2FybmluZyBpZiBuZXcgYE5hTmAKdmFsdWVzIGFyZSBwcm9kdWNlZCBidXQgbm90IGlmIGBOYU5gIGFyZ3VtZW50cyBhcmUgYmVpbmcgcHJvcGFnYXRlZC4KCiMjIyBQdXJlIFIgQ29kZQoKS2VlcCBpbiBtaW5kOgoKKiBSIGxvZ2ljYWwgdmFsdWVzIGNhbiBiZSBgVFJVRWAsIGBGQUxTRWAsIG9yIGBOQWAuCiogVXNpbmcgYW4gYE5BYCBhcyB0aGUgdGVzdCAgY29uZGl0aW9uIHdpdGggYGlmYCBzaWduYWxzIGFuIGVycm9yLgoKU28geW91IG5lZWQgdG8gc2NyZWVuIG91dCBpbmNvbWluZyBgTkEvTmFOYCB2YWx1ZXMgYmVmb3JlIGRvaW5nIGEKY29tcGFyaXNvbjoKCmBgYHtyfQpwcGFyZXRvIDwtIGZ1bmN0aW9uKHgsIGFscGhhLCBiZXRhKSB7CiAgICBiYWRfYWxwaGEgPC0gYWxwaGFbISBpcy5uYShhbHBoYSldIDw9IDAKICAgIGJhZF9iZXRhIDwtIGJldGFbISBpcy5uYShiZXRhKV0gPD0gMAogICAgaWYgKGFueShiYWRfYWxwaGEsIGJhZF9iZXRhKSkgewogICAgICAgIHdhcm5pbmcoIk5hTnMgcHJvZHVjZWQiKQogICAgICAgIGFscGhhW2JhZF9hbHBoYV0gPC0gTmFOCiAgICAgICAgYmV0YVtiYWRfYmV0YV0gPC0gTmFOCiAgICB9CiAgICB4IDwtIGlmZWxzZSh4IDw9IGFscGhhLCBhbHBoYSwgeCkKICAgIGxwIDwtIGJldGEgKiAobG9nKGFscGhhKSAtIGxvZyh4KSkKICAgIDEgLSBleHAobHApCn0KYGBgCgoKIyMjIFVzaW5nIEMgQ29kZQoKSW4gQyBjb2RlIGNvbXBhcmlzb25zIHdpbGwgcmV0dXJuIDEgZm9yIGBGYWxzZWAgYW5kIDAgZm9yIGBUUlVFYC4KClRoZSBJRUVFIGZsb2F0aW5nIHBvaW50IHN0YW5kYXJkIHNwZWNpZmllcyB0aGF0IGNvbXBhcmlzb25zIHdpdGggYE5hTmAKdmFsdWVzIGJlaGF2ZSBsaWtlIHRoaXMgKGB4YCBjYW4gYmUgYW55dGhpbmcsIGluY2x1ZGluZyBgTmFOYCBhbmQKJFxwbVxpbmZ0eSQpCgo8IS0tIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL05hTiBYLT4KCnxgTmFOID49IHhgfGBOYU4gPD0geGB8YE5hTiA+IHhgfGBOYU4gPCB4YHxgTmFOID09IHhgfGBOYU4gIT0geGB8Cnw6LS0tLS0tLS0tOnw6LS0tLS0tLS0tOnw6LS0tLS0tLS06fDotLS0tLS0tOnw6LS0tLS0tLS0tOnw6LS0tLS0tLS0tOnwKfGBGQUxTRWAgICAgfGBGQUxTRWAgICB8YEZBTFNFYCAgfGBGQUxTRWAgIHxgRkFMU0VgICAgfGBUUlVFYCAgICB8CgoKYGBgYwojaW5jbHVkZSA8UmludGVybmFscy5oPgoKdm9pZCBwcGFyZXRvKGRvdWJsZSAqeCwgZG91YmxlICphbHBoYSwgZG91YmxlICpiZXRhLCBkb3VibGUgKnAsIGRvdWJsZSAqZG4pCnsKICAgIFJfeGxlbl90IG4gPSAoUl94bGVuX3QpICpkbjsKICAgIGludCBuYV9nZW4gPSBGQUxTRTsKCiAgICBmb3IgKFJfeGxlbl90IGkgPSAwOyBpIDwgbjsgaSsrKSB7CgkJaWYgKGFscGhhW2ldIDw9IDAgfHwgYmV0YVtpXSA8PSAwKSB7CgkJCXBbaV0gPSBSX05hTjsKCQkJbmFfZ2VuID0gVFJVRTsKCQl9CgkJZWxzZSBpZiAoeFtpXSA8PSBhbHBoYVtpXSkKCQkJcFtpXSA9IDA7CgkJZWxzZSB7CgkJCWRvdWJsZSBscCA9IGJldGFbaV0gKiAobG9nKGFscGhhW2ldKSAtIGxvZyh4W2ldKSk7CgkJCXBbaV0gPSAxIC0gZXhwKGxwKTsKCQl9CiAgICB9CiAgICBpZiAobmFfZ2VuKQoJCXdhcm5pbmcoIk5hTnMgcHJvZHVjZWQiKTsKfQpgYGAKYGBgcgpkeW4ubG9hZCgicHBhcmV0by5zbyIpCgpwcGFyZXRvIDwtIGZ1bmN0aW9uKHgsIGFscGhhLCBiZXRhKSB7CiAgICBuIDwtIG1heChsZW5ndGgoeCksIGxlbmd0aChhbHBoYSksIGxlbmd0aChiZXRhKSkKICAgIHggPC0gcmVwX2xlbihhcy5kb3VibGUoeCksIG4pCiAgICBhbHBoYSA8LSByZXBfbGVuKGFzLmRvdWJsZShhbHBoYSksIG4pCiAgICBiZXRhIDwtIHJlcF9sZW4oYXMuZG91YmxlKGJldGEpLCBuKQogICAgLkMoInBwYXJldG8iLCB4LCBhbHBoYSwgYmV0YSwgcmVzdWx0ID0gZG91YmxlKG4pLAogICAgICAgYXMuZG91YmxlKG4pLCBOQU9LID0gVFJVRSkkcmVzdWx0Cn0KYGBgCi0tPgo=