Мне трудно понять следующее ПРИМЕЧАНИЕ по отправке CRAN:
* checking whether package 'fio' can be installed... [202s/46s] NOTE
Installation took CPU time 4.4 times elapsed time
Уве спросил, есть ли по умолчанию параллельный код, и да, так и было: мой код использует rayon (общий параллелизм) и faer (линейная алгебра с включенной функцией rayon). Ящики Rust. Поэтому я провел небольшой рефакторинг и добавил метод, позволяющий пользователю указывать максимальное количество потоков. Затем я начинал каждый пример, виньетку и файл readme, ограничивая количество потоков до 1, чтобы избежать параллелизма.
Тем не менее, я все еще получаю ПРИМЕЧАНИЕ. Наконец, от отчаяния я удалил виньетки, readme и прикрепил все примеры \dontrun{}
, но это тоже не сработало.
Итак, мой вопрос: помимо примеров, эпизодов и файлов readme, какие части кода выполняются во время установки пакета R? Является ли параллелизм единственным триггером для этого ПРИМЕЧАНИЕ или это может быть что-то еще?
Первая попытка заключалась в установке set_max_threads(1)
в начале примеров, виньеток и readme:
static THREADPOOL_INITIALIZED: AtomicBool = AtomicBool::new(false);
#[extendr]
/// Sets max number of threads used by fio
///
/// @details
/// Calling this function sets a global limit of threads to Rayon crate, affecting
/// all computations that runs in parallel by default.
///
/// Default behavior of Rayon is to use all available threads (including logical).
/// Setting to 1 will result in single threaded (sequential) computations.
///
/// Initialization of the global thread pool happens exactly once.
/// Once started, the configuration cannot be changed in the current session.
/// If `set_max_threads()` is called again in the same session, it'll result
/// in an error.
///
/// @param max_threads Int.
/// Default is 0 (all threads available). 1 means single threaded.
fn set_max_threads(max_threads: usize) {
// Check if ThreadPoolBuilder has already been initialized
if THREADPOOL_INITIALIZED.load(Ordering::SeqCst) {
println!("ThreadPoolBuilder has already been initialized.");
return;
}
// If max_threads is 0, use the maximum number of available threads
let num_threads = if max_threads == 0 {
num_cpus::get()
} else {
max_threads
};
// global rayon threadpool
ThreadPoolBuilder::new()
.num_threads(num_threads)
.build_global()
.unwrap();
// Mark ThreadPoolBuilder as initialized
THREADPOOL_INITIALIZED.store(true, Ordering::SeqCst);
}
.onAttach
Основываясь на этой проблеме, я также безуспешно пытался воспроизвести их подход:
# disable parallelism on CRAN
.onAttach <- function(libname, pkgname) {
if (Sys.getenv("_R_CHECK_LIMIT_CORES_") != "") {
if (as.logical(Sys.getenv("_R_CHECK_LIMIT_CORES_"))) {
packageStartupMessage("_R_CHECK_LIMIT_CORES_ is set to TRUE. Running on 2 cores")
Sys.setenv("RAYON_NUM_THREADS" = 2)
}
}
}
Также изменена версия 2.1, чтобы явно отключить фаер-параллелизм:
fn set_max_threads(max_threads: usize) {
// Check if ThreadPoolBuilder has already been initialized
if THREADPOOL_INITIALIZED.load(Ordering::SeqCst) {
println!("ThreadPoolBuilder has already been initialized.");
return;
}
// If max_threads is 0, use the maximum number of available threads
let num_threads = if max_threads == 0 {
num_cpus::get()
} else {
max_threads
};
// control faer thread pool
faer::set_global_parallelism(faer::Parallelism::Rayon(num_threads));
// for everything else?
ThreadPoolBuilder::new()
.num_threads(num_threads)
.build_global()
.unwrap();
// Mark ThreadPoolBuilder as initialized
THREADPOOL_INITIALIZED.store(true, Ordering::SeqCst);
}
@Роланд, да, есть тесты. Также пробовал их удалять. Я внесу это в список рассылки, спасибо!
Оказывается, нет ничего общего с параллельным выполнением кода (примеры, примеры, тесты и файлы readme), а только с параллельной компиляцией. Исправление заключалось в добавлении флага cargo build
к -j 2
в cargo build
и makevars
(или makevars.win
для одного потока). Спасибо Габору и Ивану из списка рассылки R-pkg-devel.
cargo build -j 2 --lib --release --manifest-path=./rust/Cargo.toml --target-dir $(TARGET_DIR)
Есть ли у вас модульные тесты, которые могут включать распараллеливание? Также обратите внимание, что распараллеливание происходит во время
R cmd install
. Я предлагаю вам передать это в список рассылки R-package-devel. Не забудьте предоставить ссылку на исходный код.