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

чувак, давай уже в Java. Тут стандарт весьма более жесткий. Бомбить у тебя будет продолжать, но не такими ковровыми бомбардировками :)

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

Ты просто сраный подражатель царя :)

Поддерживаю.

ТС, не слушай этого кретина, он местный фрик. Если хочешь угореть дико и поесть лулзов, то можешь осилить тред на досуге: Почему жабисты и растаманы лучше С++ников (jff only).

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

вы все - эдакий навальный от программирования.

Правые оппозицонные националисты? Типа мы против нынешнего комитета Це-пепе, но мы только за це-пепе и ничего кроме це-пепе, стандарт будем выдавать только по «удостоверению цепепешника», которое не будем выдавать никому, кто знает другие ЯП, и нам нужен Ритчи в качестве командующего?

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

Таааак, паждика!!! ЭТО ЖЕ ТЫ НАВАЛЬНЫЙ ОТ ПОГРОМИРОВАНИЯ!!!

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

В жаве меня не устраивает gc. Ну и многое еще по мелочи. Скажем так: в с++ стоило бы внести поддержку gc но она должна быть не сплошной а работающей только в специально выделенных хипах. Но делать ее везде это перебор.

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

Комитет это не непогрешимые ангелы. И тем более их решения не обязательно безоговорочно принимать и одобрять.

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

сьешь жирненького, пусть желчь по делу выйдет, а нех на С++ гнать

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

в C++ всё не очень хорошо с моделью памяти, не совсем понятно как сделать, чтобы GC работал с хаками, написанными мамкиными хакерами на отличных от интеля платформах. Ты бы вот взялся за написание такого GC?

а может и ну его нафиг GC для крестов? Лучше для джавы сделать опциональную возможность делать delete с предсказуемым временем работы

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

для разных типа и величины нагрузки (колбэка) константа будет разная. сетевые коллы, вычитка из диска и числомолотилка будут иметь совершенно разный разумный параллелизм. а этот код выше всех под одну гребёнку чешет.

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

код в топике нежизнеспособен кроме как в виде числомолотилки (и то hyper-threading не учитывает). а кто там автор и с какими медальками - рантайму плевать.

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

Понимание родится после практики. А в книжке может быть разве что введение в общую природу процессов. Кода как выше в хорошей книжке кроме как в смысле «это не работает в таких и таких случаях» быть не должно.

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

Цифра эта - ни о чём вообще. Нет такой цифры, кроме как под конкретный инстанс accumulate + callback под конкретный компьютер. И то всё достаточно плавает от запуска к запуску.

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

Тебе же нужен такой царь, чтобы непогрешим и безоговорочно принимать. Точно овальный.

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

практика распространения UB по цепочке триггерит всякие баги в компиляторе

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

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

по U и V pipe

И как оно пригодилось в современном мире? Слушай, ты харе уже обсираться-то.

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

Твоя позиция понятна, но реальность такова, что язык C давно перестал быть макроассемблером на батарейках, это самостоятельный язык, который не имеет никакого отношения к реальному железу и компиляторы этот факт давно используют (то же про С++). Это позволяет писать более быстрый код, пусть и ценой риска неочевидных багов. Нравится тебе это или нет, но компиляторы идут в этом направлении уже давно и сворачивать с него не будут, поэтому у тебя есть два варианта — принять новую реальность и писать корректный код или остановить мгновение и юзать какой-нибудь gcc 2.95 или ещё более тупой макроассемблер, вроде безопасники такой хотят делать, чтобы он им пустые циклы не выкидывал. А если ты не выбираешь, на чём писать, тогда у тебя и вариантов совсем немного будет.

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

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

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

в с++17 запилят таки отдельные аллокаторы, со своими зонами. и туда же можно ввести аллокатор с gc. теперь собственно ссылки из gc-памяти наружу можно оставить «как есть», а ссылки во-внутрь сделать через трамплин, типа указатель = указатель на указатель. smart_ptr потребуется какой-нибудь но это решаемо.

опять же. главная фича gc это борьба с фрагментацией памяти. оная франментация может возникать но не по всей программе а в определённой части её. например в текстовом редакторе для кода мне пришлось свои классы для строк городить чтоб победить её, например. если бы у меня была возможность сделать часть программы с GC я бы не написал монстрокод на 10к строк в итоге.

в общем, gc сделать можно и он нужен. более того, я даже думаю что действительно нужен язык лучше С++, т.к. с++11 + PMR из 17го уже лучшее что может быть с С++. дальше только прикручивание ненужных свистелок и перделок.

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

это уже перебор как они используют что-то там.

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

далее мамкины оптимизаторы решили, что эти оговорки дают им возможность оптимизировать нахер вообще всё и понеслось. так вот, это не так: основным бичом производительности является промах по кэшу:

http://research.cs.wisc.edu/vertical/papers/2013/isa-power-struggles-tr.pdf

http://www.slideshare.net/JosePinilla/eece528-06ilplimitationsjose

я куда-то проололил еще две работы, там еще круче графики на multi2sim делал, а симулили они например gcc, 3д-рендер и прочие сложные алгоритмы. там прямо цветные столбики с описанием где конкретно говно попёрло. L1D miss просто в усмерть бил. еще была симуляция для пней2 и пней3, там IPC~=1 как будто и не было out-of-order execution.

собсна, я свой проц делаю как раз под обход этой главной проблемы. на интеле же проблемой является отсутсвие непадающих команд чтения-записи памяти. ну просто префикс ввели бы «dontfail» и доп.регистр флагов «отказа». чтоб можно было превентивно без проверок провести вычисления а потом когда уже понятно надо оно или нет условная запись в память.

а что делают мамкины оптимизаторы? они пытаются максимально «протолкнуть» вычисление даже не значений а битов из этих значений повыше в выражениях. накуа, если CPI даже на седьмой корке в районе единицы болтается? Там запас прочности троекратный. CPI=0.7 это IPC=1/0.7=1.42 из 4х возможных. возьми да посчитай значения эти в лоб, это дешевле выходит в итоге, чем «битовую магию» дрочить а потом не мочь собрать ведро потому что gcc с ума сошёл.

ckotinko ☆☆☆
()
Последнее исправление: ckotinko (всего исправлений: 1)
Ответ на: комментарий от ckotinko

забавно сравнивать ipc пня2 с corei7. такое усложнение лютое и ~1 стало ~1.42

это уже открыто обсуждается:

http://www.extremetech.com/computing/116561-the-death-of-cpu-scaling-from-one...

http://preshing.com/20120208/a-look-back-at-single-threaded-cpu-performance/

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

ckotinko ☆☆☆
()
Последнее исправление: ckotinko (всего исправлений: 1)
Ответ на: комментарий от ckotinko

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

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

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

Я не знаю платформ где int не является 2-complement. Может какая нибудь ламповая или транзисторная экзотика из 60-70х.

В нормальных эвм ub при переполнении означает дистрибутивность и ассоциативность ряда операций как в матане и всё.

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

даже уточню в виде художественной аналогии

Предположим, что далеко-далеко в высокой горе стоит замок и в нём живет прекрасная принцесса. Вообще замечательная и практически без изъянов, кроме одного: она иногда какает. Ну вот не получается сделать принцессу так, чтоб она не какала. А замок охраняет дракон, и он сука тоже какает. Точнее он срёт. Все подходы к замку обосрал вооот такими кучами говна. А самое главное - он принцессу не выпускает, и изза этого и замок и сама принцесса провоняли драконьим говном.

И вот приходит рыцарь освобождать принцессу, а там насрано. Рыцарь всё понимает, он знает что только в сказках принцессы не какают и мужественно пробирается через залежи драконьего говна, целует принцессу, и уносит её в баню.

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

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

Код моей программ вычисляет два uint в диапазоне [0-8191] и дельту равную плюс или минус один. Надеюсь не надо объяснять как выглядит минус один для uint?

И идет в цикле от первого числа до второго прибавляя дельту и обрезая лишние биты логическим И которое обезьяны почему то называют «арифметическим». Что тут может быть неправильно то? Где там переполнение то даже с int может быть? Логические операции что ли переполняютчя?

Компилятор глючит и ядро уже собрать не может а вы рассказываете сказки про какие то баги.

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

В стандарте допускаются три возможные репрезентации int, если не ошибаюсь.

А понятие «нормальная эвм» для «портативного ассемблера» C отсутствиет.

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

Надеюсь не надо объяснять как выглядит минус один для uint?

Никак не выглядит. Есть несколько возможных решений данной задачи на живом (окаменелом) железе. А как оно выглядит для C - в стандарте нужно искать.

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

Надеюсь не надо объяснять как выглядит минус один для uint?

Сишный стандарт гуглить не хочу, но возможные варианты вот тут:

http://www.cs.grin.edu/~walker/courses/161.sp10/readings/reading-binary.shtml...

Sign-Magnitude Notation One's Complement Two's Complement

В биты это говно раскладывать желания нет. Один раз понадобилось только для гарантии портабельности.

dzidzitop ★★
()

ckotinko опять насрал в тред про плюсы. Ничего не меняется.

ТС предлагаю ознакомиться, например, с этим платиновым тредом, чтобы сформировать представление о пациенте: Почему жабисты и растаманы лучше С++ников

А по теме: может всё-таки не стоит заострять внимание на синтетических примерах из книжек? Имхо, они, отчасти, созданы, чтобы сформировать понимание (читай «базовые концепции»), и, отчасти, для наступания на грабли, чтобы читатель удосужился выбраться за пределы книги.

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

Просто ну видно как эти люди латают характерные для говнопроектов проблемы языком программирования

чет в голос

проблемы «сложности кодописания» пофиксили изобретением однопоточного джаваскрипта
проблемы кроссплатформенности пофиксили веббраузером, жрущим по 4гб на простейший интерфейс
проблему «никто не использует GLSL, а все используют супермощные видеокарты для загрузки текстурок и статических 3д моделек», пофиксили- изобретением Vulkan-а в котором принудительный GLSL во все поля

твоя цитата это 2004 год, если не раньше, у тебя криокамера протекла
актуальные языки и проблемы шагнули куда дальше (в развитии)

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

ну вообще-то вулкан это шаг вперед по сравнению с OpenGL. вы видимо никогда не сталкивались с GL по серьезному и не представляете какая это боль сделать там ну допустим нормальное освещение. с вторичным светом например. причем геморрой именно изза синхронизации.

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

Стыдно писать на С++. как из душа окатило.

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

оно отсутствует потому что С делали во времена PDP11, VAX и прочей сраной interdatы. undefined null pointer был у них потому, что на PDP11 и VAX по нулевому указателю лежал ноль, и в те годы дереференсить нулевой указатель было нормально. в interdatе вообще это была нормальная память, туда можно было насрать и почитать.

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

Где эти процы-то? Их в музее уже не найдешь. Для null pointer поведение определено на уровне ОС. Был такой баг, когда пульсу мапали в нулевые адреса, писали туда «звук», и при обращении по нулевому указателю выполняли этот «звук». Это пофиксили, запретив наглухо первые N килобайт(64 по моему) на уровне ведра. Но null pointer - не баг. Если пишешь ведро загружаемое через граб, то null pointer при CR0.PG=0 он вполне нормальный и указывает в начало таблицы адресов прерываний в 16битном режиме.

ckotinko ☆☆☆
()
Последнее исправление: ckotinko (всего исправлений: 1)
Ответ на: комментарий от dzidzitop

А как оно выглядит для C - в стандарте нужно искать.

~0

я не работаю с музейным железом, ламповыми эвм и т.д.

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

покажи мне 1(один) процессор, GPU или иное доступное на рынке устройство, где int не 2-complement. хотя бы одно.

мне вообще похеру что там сочинили кастрюлеголовые академики. 2-complement принят как безусловный стандарт просто потому, что один сумматор проще чем два разных. всё дело в сраных транзисторах, чувак. аппаратные алгоритмы умножения уже тоже стандартные, если ты не знал. там используют схему Бута(Booth), 4:2 compressorы, и они все тоже 2-complement. Нету железа другого.

Хуле ты мне суешь ссылки на какое-то edu? Я сам могу придумать процессор из девочек, где числа будут состоять из няшечек и обнимашек. А могу придумать процессор из бротанов, где числа состоят из пива и семок. Мои разработки будут даже лучше, т.к. я это говно за свой счет и в свое свободное время придумаю, а эти поцы на чужие деньги страдают хернёй

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

оно выглядит НЕ так. Two's complement - это одно из возможных представлений целочисленных типов.

Компилятор не интересуют твои душевные страдания.

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

покажи мне 1(один) процессор, GPU или иное доступное на рынке устройство, где int не 2-complement. хотя бы одно.

Не интересуюсь железом - поэтому мне пофигу есть ли такие. Но стандарт позволяет - так что такие фокусы работать не будут. Так же как не будут работать в портируемом коде фокусы типа 'z' - x для определения порядка букв латинского алфавита. (Для юникодных литералов - будут).

И мне похер на каком харде будет выполняться мой код, если он не содержит UB.

dzidzitop ★★
()
Последнее исправление: dzidzitop (всего исправлений: 1)
Ответ на: комментарий от ckotinko

У тебя профдеформация от ассемблера. Нулевой указатель НУЖЕН в си, чтобы его не было язык нужно передизайнить как какой-нибудь Kotlin по сравнению с java. Он мапится на физический ноль хотя бы потому что сравнения выходят проще. И как бонус - типичные платформы умеют отлавливать обращение к нему.

Не путай причину и следствие, падший железячник.

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

Ну и когда плюсцовый стандарт будет позволять только two's complement и ASCII и много чего ещё, то это будет хорошо. А пока что кушайте что дают. Ну или не кушай и не обмазывайся ~0 вместо static_cast<unsigned>(-1) или ~0u (в зависимости от контекста).

dzidzitop ★★
()
Последнее исправление: dzidzitop (всего исправлений: 1)
Ответ на: комментарий от dzidzitop

Не интересуюсь железом

Я интересуюсь железом и придумал свой проц, а теперь пишу IDE чтоб его выложить в формате GDSII, отладить и писать к нему код(а да, проц очень нестандартный и может параллелить однопоточные программы и тут нужен спецкомпилятор). Я тебе просто говорю что не будет больше железа без дополнительного кода. В первую очередь потому, что основные блоки в 2'complement - не надо дублировать для разных случаев(+/- и их комбинации). Указатели - тоже используют эту фичу для арифметики. Ты же не думаешь что в проце будут разные АЛУ для указателей, int и uint? Всё, этого не будет.

При чем тут портируемый код. x86, ARM, MIPS, всякие MSP430, AVR, восьмибитные контроллеры всякие, Radeon, NVidia, intel hd, ... они все 2-compement.

Ты не найдешь другого железа.

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

Был такой баг, когда пульсу мапали в нулевые адреса, писали туда «звук», и при обращении по нулевому указателю выполняли этот «звук». Это пофиксили

А зря! Это ж фича, обратился ты такой по нулю, а тебе из динамиков: «Лох!».

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

Ага, в 60е тоже так говорили про one's complement.

Осознай смысл слова «портируемый» и отличие этого смысла от «портируемый на x86, ARM, MIPS, всякие MSP430, AVR, восьмибитные контроллеры всякие, Radeon, NVidia, intel hd, ...», почитай стандарт языка, и потом уже переставай пользоваться костыльными ~0 или меняй язык, на котором пишешь.

А тем, кто не понимает разницы между гарантиями согласно спецификации и положением дел в уютном мирке 1996 (подставить по вкусу) года, в программировании делать нечего.

dzidzitop ★★
()
Последнее исправление: dzidzitop (всего исправлений: 2)
2 мая 2018 г.
Ответ на: комментарий от ckotinko

Я не знаю платформ где int не является 2-complement.

Даже если в C++ постулируют, что целые знаковые числа представляются только в 2-complement, UB при переполнении не уберут.

Это ортогональные вещи.

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

Я интересуюсь железом и придумал свой проц

Покажи нам модель!

а теперь пишу IDE чтоб его выложить в формате GDSII,

Сразу в гдс2, минуя rtl и нетлист?

может параллелить однопоточные программы и тут нужен спецкомпилятор

Это мы проходили в софт машинс.

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