Почему в std нет "forall"?параллель?
Я просматривал новый std.параллельная библиотека . Я не языковой или библиотечный дизайнер, так что простите мое невежество, но не было бы полезно, если бы в языке или, по крайней мере, в std был оператор forall
.параллель?
Например, вместо этого:
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 ответа:
Я думаю, что вы неправильно понимаете, что такое ЗППП.параллелизм делает с
foreach
. Если вы посмотрите на документацию, в ней конкретно говорится, чтоОтрыв от параллельного фореша цикл через разрыв, помеченный разрывом, с надписью продолжить, вернуться или Гото заявление бросает ParallelForeachError.
Таким образом, Выне можете вырваться из него в любое время, если вы не создадите исключение - что в точности соответствует случаю с
D по своей природе является последовательным языком, как и большинство языков программирования. Он предоставляет некоторые мощные функции, которые относятся к потоковой обработке (например, по умолчанию в потоковом локальном хранилище), но я ожидаю, что это потребует изрядного редизайна, чтобы поместить что-то вродеforall
. Когда вы используетеforeach
сparallel
, Вы говорите ему распределить итерации этого цикла по отдельным потокам. Они почти наверняка раздаются в последовательном порядке, но выполняются параллельно, и вам на самом деле наплевать на порядок. Если бы вы это делали, вы не могли бы делать их параллельно. Так что, добавивforall
, вы ничего не купите здесь.forall
непосредственно в язык. И, как оказалось, в этом нет необходимости. Язык достаточно мощный,чтобы на нем можно было построить параллелизм. станд.параллелизм эффективно дает вамforall
. Просто он делает это, используя существующую языковую функциюforeach
вместо того, чтобы изменять язык, чтобы понимать и содержатьforall
Как встроенная функция.И, как отмечает CyberShadow, новый модуль, std.parallel_algorithm, находится в работах, которые будут иметь параллельные версии многих функций в std.алгоритм, чтобы вы получили этот параллелизм бесплатно. В целом, ЗППП.параллелизм, кажется, делает хорошую работу, давая простые в использовании, но мощные функции параллелизма для D.
Как насчет этого?
Я должен отметить, чтоauto logs = array(taskPool.amap!`log(a + 1.0)`(iota(0, 1_000_000)));
std.parallel_algorithm
является в работах.