Отключить параллелизм во время установки

1 ПРОБЛЕМА

Мне трудно понять следующее ПРИМЕЧАНИЕ по отправке 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? Является ли параллелизм единственным триггером для этого ПРИМЕЧАНИЕ или это может быть что-то еще?

2 ПОПЫТАЛОСЬ И НЕУДАЧНО

2.1 Отключение параллелизма в примерах, виньетках и readme

Первая попытка заключалась в установке 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);
}

2.2 Отключение с помощью .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.3 Отключение фаер-параллелизма

Также изменена версия 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);
}

Есть ли у вас модульные тесты, которые могут включать распараллеливание? Также обратите внимание, что распараллеливание происходит во время R cmd install. Я предлагаю вам передать это в список рассылки R-package-devel. Не забудьте предоставить ссылку на исходный код.

Roland 16.07.2024 07:27

@Роланд, да, есть тесты. Также пробовал их удалять. Я внесу это в список рассылки, спасибо!

Alberson Miranda 16.07.2024 23:25
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Оказывается, нет ничего общего с параллельным выполнением кода (примеры, примеры, тесты и файлы 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)

Другие вопросы по теме