@ProCxx

Страница 2161 из 2477
olologin
26.06.2018
21:44:33
на x86 байт и меньше атомарны вроде

Ignat
26.06.2018
21:45:04
гонки по данным — UB, volatile тут ни при чём

Google
olologin
26.06.2018
21:45:34
ну да, может задающий вопрос и не это имеет ввиду

Ilia
26.06.2018
21:45:50
Ioann V
26.06.2018
21:46:10
Волатиль это ж анти кеш?

Ilia
26.06.2018
21:46:30
нет

Ioann V
26.06.2018
21:47:05
Анти кеш из регистра я думал. Хм

Ilia
26.06.2018
21:47:13
olologin
26.06.2018
21:47:51
Anatoly
26.06.2018
21:47:52
volatile object - an object whose type is volatile-qualified, or a subobject of a volatile object, or a mutable subobject of a const-volatile object. Every access (read or write operation, member function call, etc.) made through a glvalue expression of volatile-qualified type is treated as a visible side-effect for the purposes of optimization (that is, within a single thread of execution, volatile accesses cannot be optimized out or reordered with another visible side effect that is sequenced-before or sequenced-after the volatile access. This makes volatile objects suitable for communication with a signal handler, but not with another thread of execution, see std::memory_order). Any attempt to refer to a volatile object through a non-volatile glvalue(e.g. through a reference or pointer to non-volatile type) results in undefined behavior.

Ilia
26.06.2018
21:48:12
Даже гонки нет?
Для гонок нужно как минимум два потока

Крис
26.06.2018
21:48:30
Нашел все таки

Неопределенное поведение

Except where noted, evaluations of operands of individual operators and of subexpressions of individual expressions are unsequenced. [ Note: In an expression that is evaluated more than once during the execution of a program, unsequenced and indeterminately sequenced evaluations of its subexpressions need not be performed consistently in different evaluations. — end note ] The value computations of the operands of an operator are sequenced before the value computation of the result of the operator. If a side effect on a scalar object is unsequenced relative to either another side effect on the same scalar object or a value computation using the value of the same scalar object, the behavior is undefined. [ Example: void f(int, int); void g(int i, int* v) { i = v[i++]; // the behavior is undefined i = 7, i++, i++; // i becomes 9 i = i++ + 1; // the behavior is undefined i = i + 1; // the value of i is incremented f(i = -1, i = -1); // the behavior is undefined } — end example ] When calling a function (whether or not the function is inline), every value computation and side effect associated with any argument expression, or with the postfix expression designating the called function, is sequenced before execution of every expression or statement in the body of the called function. [ Note: Value computations and side effects associated with different argument expressions are unsequenced. — end note ] Every evaluation in the calling function (including other function calls) that is not otherwise specifically sequenced before or after the execution of the body of the called function is indeterminately sequenced with respect to the execution of the called function.9 Several contexts in C++ cause evaluation of a function call, even though no corresponding function call syntax appears in the translation unit. [ Example: Evaluation of a new expression invokes one or more allocation and constructor functions; see [expr.new]. For another example, invocation of a conversion function ([class.conv.fct]) can arise in contexts in which no function call syntax appears. — end example ] The sequencing constraints on the execution of the called function (as described above) are features of the function calls as evaluated, whatever the syntax of the expression that calls the function might be.

Google
Крис
26.06.2018
21:48:48
Но как-то это все равно непонятно

Anatoly
26.06.2018
21:49:54
Но как-то это все равно непонятно
Ты не то нашел, я выше тебе кинул с сппреференса

Крис
26.06.2018
21:50:22
Вопрос то непростой оказался...

Anatoly
26.06.2018
21:50:41
Нет тут UB никакого...
Ильюха, ну хоть в стандарт загляни

Vladislav
26.06.2018
21:54:13
Ignat
26.06.2018
21:55:20
А a+a? Где здесь glvalue?
нет glvalue — нет non-volatile glvalue!

Alexey
26.06.2018
22:07:26
что-то я совсем запутался, где в a+a non-volatile glvalue?

Михаил
27.06.2018
06:09:56
Доброго времени суток! Возник такой вопрос: есть 2 консольных приложения, оба запускаются через пайплайн (т.е. вывод (stdout) одного является входом (stdin) для другого процесса). Приложение которое генерит данные многопоточное, в каждом потоке производятся вычисления и готовится символьный буфер, далее происходит блокировка (spin_lock, чтобы избежать перехода в режим ядра) и весь буфер сбрасывается в stdout (чтобы уменьшить число системных вызовов). Профайлер показывает что больше всего времени уходит на запись буфера в stdout. Можно ли как-то ускорить вывод в stdout? Я пробовал: писать через cout.write(...) с sync_with_stdio(false), писать через fwrite/write, играться размером буфера, отключать буферизацию, все результаты отличаются максимум на 20-30% (если это как-то может помочь - то при перенаправлении в файл пропускная способность 200-230 Мб/с (походу край для моего hdd)). Может кто встречался/знает какие библиотеки/советы на эту тему?

Vhäldemar
27.06.2018
06:14:36
ос?

Ilia
27.06.2018
06:20:53
Доброго времени суток! Возник такой вопрос: есть 2 консольных приложения, оба запускаются через пайплайн (т.е. вывод (stdout) одного является входом (stdin) для другого процесса). Приложение которое генерит данные многопоточное, в каждом потоке производятся вычисления и готовится символьный буфер, далее происходит блокировка (spin_lock, чтобы избежать перехода в режим ядра) и весь буфер сбрасывается в stdout (чтобы уменьшить число системных вызовов). Профайлер показывает что больше всего времени уходит на запись буфера в stdout. Можно ли как-то ускорить вывод в stdout? Я пробовал: писать через cout.write(...) с sync_with_stdio(false), писать через fwrite/write, играться размером буфера, отключать буферизацию, все результаты отличаются максимум на 20-30% (если это как-то может помочь - то при перенаправлении в файл пропускная способность 200-230 Мб/с (походу край для моего hdd)). Может кто встречался/знает какие библиотеки/советы на эту тему?
Профайлер показывает что больше всего времени уходит на запись буфера в stdout. -- так и должно быть, операции ввода-вывода самые долгие. Чтобы реально понять, что у тебя там тормозит, и тормозит ли, тебе надо ЗАБЛОКИРОВАТЬ (выключить) вывод в stdout на время прогона в профайлере.

Constantine
27.06.2018
06:21:49
Я полагаю товарищ хочет вывод быстрый

Ilia
27.06.2018
06:22:03
Доброго времени суток! Возник такой вопрос: есть 2 консольных приложения, оба запускаются через пайплайн (т.е. вывод (stdout) одного является входом (stdin) для другого процесса). Приложение которое генерит данные многопоточное, в каждом потоке производятся вычисления и готовится символьный буфер, далее происходит блокировка (spin_lock, чтобы избежать перехода в режим ядра) и весь буфер сбрасывается в stdout (чтобы уменьшить число системных вызовов). Профайлер показывает что больше всего времени уходит на запись буфера в stdout. Можно ли как-то ускорить вывод в stdout? Я пробовал: писать через cout.write(...) с sync_with_stdio(false), писать через fwrite/write, играться размером буфера, отключать буферизацию, все результаты отличаются максимум на 20-30% (если это как-то может помочь - то при перенаправлении в файл пропускная способность 200-230 Мб/с (походу край для моего hdd)). Может кто встречался/знает какие библиотеки/советы на эту тему?
В общем, цель-то у тебя какая ? Ускорить генерирующее приложение, или ускорить передачу данных между этой парой?

Constantine
27.06.2018
06:22:45
Я полагаю консольки достаточно медленные, как и пайпы

Ilia
27.06.2018
06:22:53
Я полагаю товарищ хочет вывод быстрый
Я полагаю, товарищу сказали, "НАДО УСКОРИТЬ", и он запустил профайлер, и решил, что тормозить IO. Но это нормально, IO ВСЕГДА ТОРМОЗИТ.

Google
Konstantin
27.06.2018
06:24:22
https://www.reddit.com/r/unix/comments/6gxduc/how_is_gnu_yes_so_fast/?st=j3v3iw3c&sh=5651ea3c

Anton
27.06.2018
06:24:27
"spin_lock, чтобы избежать перехода в режим ядра" ... )

Ilia
27.06.2018
06:24:35
Vhäldemar
27.06.2018
06:24:55
не очень понятна цель, какая нужна скорость?

Михаил
27.06.2018
06:25:56
Читает stdin и тоже производит счет, видно что оно простаивает пока ждет данные

Mikhail Voronov
27.06.2018
06:26:03
Я полагаю консольки достаточно медленные, как и пайпы
+1, запист в пайп обычно медленее записи в файл

Ilia
27.06.2018
06:26:12
Ускорить именно передачу, т.к. с генерацией все норм
Ну надо просто от этой модели работы уходить, убирать пайп вообще. Либо два приложения свести в одно, это вообще идеально, либо уйти от ввода-вывода, передавать через shared memory например

Михаил
27.06.2018
06:26:31
Т.е. первое не успевает запитать данными второе

Anton
27.06.2018
06:26:33
там наверно одно из ядер кипятится на этом спинлоке пока консоль ворочается

Михаил
27.06.2018
06:27:02
Ilia
27.06.2018
06:27:31
Это я понимаю)
Ну просто убирай пайп на фиг.

Vhäldemar
27.06.2018
06:27:36
линукс? сколько ядер?

Михаил
27.06.2018
06:27:48
От второго приложения нет исходников к сожалению из -за этого и пайпы

Михаил
27.06.2018
06:28:43
линукс? сколько ядер?
Windows пока, но linux в планах

Google
Ilia
27.06.2018
06:29:12
Windows пока, но linux в планах
А на Линух то второе приложение само перекомпилируется?

Vhäldemar
27.06.2018
06:29:55
может, там какая-то извесная программа

Admin
ERROR: S client not available

Mikhail Voronov
27.06.2018
06:30:12
Windows пока, но linux в планах
а ты по сколько байт записываешь в пайп за раз?

Ilia
27.06.2018
06:30:46
а ты по сколько байт записываешь в пайп за раз?
Ну он же написал, что буфер накапливается и сбрасывается

Vhäldemar
27.06.2018
06:30:48
без понятия, кто там ест стдин

Mikhail Voronov
27.06.2018
06:31:33
если будешь больше 4096, то всё будет храниться в невыгружаемом пуле в ядре (т.е. в оперативке), что будет быстрее, чем в выгружаемом

Ilia
27.06.2018
06:34:16
Доброго времени суток! Возник такой вопрос: есть 2 консольных приложения, оба запускаются через пайплайн (т.е. вывод (stdout) одного является входом (stdin) для другого процесса). Приложение которое генерит данные многопоточное, в каждом потоке производятся вычисления и готовится символьный буфер, далее происходит блокировка (spin_lock, чтобы избежать перехода в режим ядра) и весь буфер сбрасывается в stdout (чтобы уменьшить число системных вызовов). Профайлер показывает что больше всего времени уходит на запись буфера в stdout. Можно ли как-то ускорить вывод в stdout? Я пробовал: писать через cout.write(...) с sync_with_stdio(false), писать через fwrite/write, играться размером буфера, отключать буферизацию, все результаты отличаются максимум на 20-30% (если это как-то может помочь - то при перенаправлении в файл пропускная способность 200-230 Мб/с (походу край для моего hdd)). Может кто встречался/знает какие библиотеки/советы на эту тему?
все результаты отличаются максимум на 20-30% (если это как-то может помочь - то при перенаправлении в файл пропускная способность 200-230 Мб/ вот так вот и будет, там больше не ускорить.

Михаил
27.06.2018
06:36:51
если будешь больше 4096, то всё будет храниться в невыгружаемом пуле в ядре (т.е. в оперативке), что будет быстрее, чем в выгружаемом
Пробовал 256, 1024, 4096, 65536, 1 Мб. Для 256, 1024, все не очень идет, с 65536 быстрее, 1 Мб самый быстрый но от 4096 отличается на 20%

Vhäldemar
27.06.2018
06:37:03
так, а через пайп какая скорость-то? вдруг у него там 5 мб/с

Mikhail Voronov
27.06.2018
06:40:43
Пробовал 256, 1024, 4096, 65536, 1 Мб. Для 256, 1024, все не очень идет, с 65536 быстрее, 1 Мб самый быстрый но от 4096 отличается на 20%
скорость ещё от версии Windows будет зависеть, 1 Мб быстрее 4096 т.к. каждый вызов записи в пайп - переключение в ядро с копированием туда данных. Соответственно лучше сразу больше в разумных пределах записать.

Mikhail Voronov
27.06.2018
06:42:14
ещё можно с thread affinity поиграться

Михаил
27.06.2018
06:42:40
ещё можно с thread affinity поиграться
Хм. Поднять приоритет для потока который пишет в stdout?

Vhäldemar
27.06.2018
06:45:50
Через пайп не мерил, но точно быстрее.
странный подход, имхо, но то такое

Google
Vhäldemar
27.06.2018
06:46:47
но мы до сих пор не знаем, какая ОС, сколько ядер и прочее

вдруг у тебя там дебажные версии, вообще

Михаил
27.06.2018
06:48:29
нет, на разные ядра шедулить
А ясно. Целевая ОС Windows 10 Enterprise процы Intel. Ядер по разному на разных машинах у разных заказчиков. Все версии release x64, статическая линковка (/MT)

А, еще вопрос на будущее: если ситуация будет обратная, т.е. приложение изготовитель будет слишком много данных генерить и приложение потребитель не будет успевать их прожевать, если ли вероятность что-то потерять? Если есть как программно понять какой максимальный размер буфера stdout/stdin?

Vhäldemar
27.06.2018
07:04:01
оно для стдоут сработает?

Fuzzytoozy
27.06.2018
07:06:38
А почему нет?

Ребят а знает кто где найти как __builtin_launder работает в gcc? Я что-то никак не найду нигде

В плане что за хак он делает во время компиляции

Spoonson
27.06.2018
07:20:01
ты про его реализацию в коде гцц, или зачем он нужен?

Fuzzytoozy
27.06.2018
07:24:30
Что он делает на уровне компиляции

Страница 2161 из 2477