Почему в std.parallel нет «forall»? - PullRequest
2 голосов
/ 27 июня 2011

Я перебираю новую библиотеку 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 ]

5 голосов
/ 28 июня 2011

Я думаю, что вы не понимаете, что делает std.parallelism с foreach.Если вы посмотрите на документацию , в ней будет конкретно указано, что

Прерывание из параллельного цикла foreach с помощью оператора break, помеченного как break, помеченного continue, return или goto генерирует ParallelForeachError.

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

D по своей природе является последовательным языком, как и большинство языков программирования.Он предоставляет несколько мощных функций, связанных с многопоточностью (например, по умолчанию используется локальное хранилище потоков), но я ожидаю, что потребуется немало редизайна, чтобы поместить что-то вроде forall непосредственно в язык.И, как оказалось, в этом нет необходимости.Язык достаточно мощный, чтобы допустить параллелизм на его основе.std.parallelism эффективно дает вам forall.Просто он делает это, используя существующую языковую функцию foreach вместо того, чтобы изменять язык, чтобы понимать и содержать forall в качестве встроенной функции.

И, как CyberShadownotes , в работе находится новый модуль std.parallel_algorithm, который будет иметь параллельные версии многих функций в std.algorithm, так что вы получите этот параллелизм бесплатно.В целом, std.parallelism, кажется, делает хорошую работу, предоставляя простые в использовании, но мощные функции параллелизма для D.

5 голосов
/ 27 июня 2011

Как насчет этого?

auto logs = array(taskPool.amap!`log(a + 1.0)`(iota(0, 1_000_000)));

Следует отметить, что std.parallel_algorithm в работах .

...