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

Ilia
26.06.2018
21:44:52

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
Вопрос то непростой оказался...

Ilia
26.06.2018
21:50:36

Anatoly
26.06.2018
21:50:41

Ioann V
26.06.2018
21:53:07

Vladislav
26.06.2018
21:54:13

Ignat
26.06.2018
21:55:20

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

Ilia
27.06.2018
04:54:58

Constantine
27.06.2018
05:00:58


Михаил
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

Google

Михаил
27.06.2018
06:24:22

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

Ilia
27.06.2018
06:26:12

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

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

Ilia
27.06.2018
06:26:35

Михаил
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
От второго приложения нет исходников к сожалению из -за этого и пайпы

Ilia
27.06.2018
06:28:07

Михаил
27.06.2018
06:28:43

Google

Ilia
27.06.2018
06:29:12

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

Admin
ERROR: S client not available

Mikhail Voronov
27.06.2018
06:30:12

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


Михаил
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 мб/с

Михаил
27.06.2018
06:37:58

Mikhail Voronov
27.06.2018
06:40:43

Михаил
27.06.2018
06:41:35

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

Михаил
27.06.2018
06:42:40

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?

Fuzzytoozy
27.06.2018
07:00:25

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
Что он делает на уровне компиляции