LINUX.ORG.RU

Многопоточность в С++11

 ,


0

1

Всем привет, читаю в данный момент книгу по многопоточности в С++, так вот там есть примерно такой код:

template<typename Iterator,typename T>
T parallel_accumulate(Iterator first,Iterator last,T init)
{
unsigned long const length=std::distance(first,last);
if(!length)
return init;
unsigned long const min_per_thread=25;
unsigned long const max_threads=
(length+min_per_thread-1)/min_per_thread;
unsigned long const hardware_threads=
std::thread::hardware_concurrency();

Я надеюсь что по контексту будет примерно понятно что код делает.

Может быть кто-то знает почему min_per_thread=25? В гугле найти не могу, в книге объяснений нет, единственное:

«Although this is quite a long function, it’s actually straightforward. If the input range is empty B, you just return the initial value init. Otherwise, there’s at least one element in the range, so you can divide the number of elements to process by the minimum block size in order to give the maximum number of threads c. This is to avoid creating 32 threads on a 32-core machine when you have only five values in the range.»

Ответ на: комментарий от ckotinko

моя позиция такова, что нельзя злоупотреблять UB, нельзя толковать его расширительно, т.е. из того что UB при сложении-вычитании не следует, что его результат распространяется дальше через остальные операции. Потому это де-факто это приводит к UB там, где он не оговорен.

А вот позиция разработчиков стандарта и компиляторов другая. В программе не должно быть UB, е если оно случится, то поведение всей программы не определено. Не платформоспецифично, а именно неопределено.

German_1984 ★★
()
Ответ на: комментарий от ckotinko

вообще зачем UB придумали?

Чтобы избежать ситуаций, когда одна и та же программа работает по-разному на разном железе.

для того, чтоб сделать возможными ряд оптимизаций, например в цикле.

Неправда. UB для оптимизации начали использовать значительно позже

надо понимать, для чего это делалось.

Вот именно. И у вас этого понимания нет.

German_1984 ★★
()
Ответ на: комментарий от German_1984

Справедливости ради, UB для оптимизации применяется в Rationale ещё к C89 стандарту.

https://www.lysator.liu.se/c/rat/b.html#2-1-2-3

The previous example shows that a subexpression can be pre-computed in the real implementation. A question sometimes asked regarding optimization is, ``Is the rearrangement still conforming if the pre-computed expression might raise a signal (such as division by zero)?" Fortunately for optimizers, the answer is ``Yes," because any evaluation that raises a computational signal has fallen into an undefined behavior (§3.3), for which any action is allowable.

anonymous
()
Ответ на: комментарий от German_1984

Я писал чуть выше, что представление отрицательных чисел и поведение при переполнении — ортогональные вещи.

То, что отрицательные числа представляются в two's complement, не значит, что INT_MAX + 1 == INT_MIN

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.