Почему в 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 2

2 ответа:

Я думаю, что вы неправильно понимаете, что такое ЗППП.параллелизм делает с foreach. Если вы посмотрите на документацию, в ней конкретно говорится, что

Отрыв от параллельного фореша цикл через разрыв, помеченный разрывом, с надписью продолжить, вернуться или Гото заявление бросает ParallelForeachError.

Таким образом, Выне можете вырваться из него в любое время, если вы не создадите исключение - что в точности соответствует случаю с forall. Когда вы используете foreach с parallel, Вы говорите ему распределить итерации этого цикла по отдельным потокам. Они почти наверняка раздаются в последовательном порядке, но выполняются параллельно, и вам на самом деле наплевать на порядок. Если бы вы это делали, вы не могли бы делать их параллельно. Так что, добавив forall, вы ничего не купите здесь.

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