Почему в std.parallel нет 'forall'?
Я перебираю новую библиотеку std.parallel. Я не являюсь разработчиком языка или библиотеки, так что прости мое невежество, но разве не было бы полезно, если бы forall
утверждение на языке или хотя бы в std.parallel?
Например, вместо этого:
auto logs = new double[1_000_000];
foreach(i, ref elem; taskPool.parallel(logs)){
elem = log(i + 1.0);
}
мы могли бы написать это:
auto logs = new double[1_000_000];
forall!((x){ return log(x + 1.0); })(logs);
foreach
является последовательным по своей природе, и мы можем выйти из него в любое время, тогда как forall
это гарантия того, что все элементы будут обработаны. Это правильное утверждение? Это только вопрос времени, прежде чем forall
реализовано, или есть веская причина, чтобы не иметь его?
2 ответа
Я думаю, что вы не понимаете, что делает std.parallelism foreach
, Если вы посмотрите на документацию, в ней конкретно указано, что
Прерывание параллельного цикла foreach с помощью оператора break, помеченного как break, помеченного как continue, return или goto приводит к возникновению ошибки ParallelForeachError.
Таким образом, вы не можете выйти из него в любое время, если вы не выбросите исключение - это именно то, что было бы в случае forall
, Когда вы используете foreach
с parallel
, вы говорите, чтобы разделить итерации этого цикла на отдельные потоки. Они почти наверняка распределены в последовательном порядке, но они выполняются параллельно, и вам не очень важен порядок. Если бы вы сделали, вы не могли бы сделать их параллельно. Итак, добавив forall
не куплю тебе ничего здесь.
D по своей природе является последовательным языком, как и большинство языков программирования. Он предоставляет некоторые мощные функции, которые относятся к многопоточности (например, по умолчанию используется локальное хранилище потоков), но я ожидаю, что потребуется немного переделать, чтобы что-то вроде forall
прямо на языке. И, как оказалось, в этом нет необходимости. Язык достаточно мощный, чтобы можно было построить параллелизм поверх него. std.parallelism эффективно дает вам forall
, Просто он делает это с помощью существующей языковой функции foreach
вместо того, чтобы менять язык, чтобы понимать и содержать forall
как встроенная функция.
И, как отмечает CyberShadow, в работе находится новый модуль std.parallel_algorithm, который будет иметь параллельные версии многих функций в std.algorithm, так что вы получите этот параллелизм бесплатно. В целом, std.parallelism, кажется, делает хорошую работу, предоставляя простые в использовании, но мощные функции параллелизма для D.
Как насчет этого?
auto logs = array(taskPool.amap!`log(a + 1.0)`(iota(0, 1_000_000)));
Я должен отметить, что std.parallel_algorithm
находится в работах.