Re[15]: Эрланг и все-все-все (на самом деле, не совсем)
От: alex_public  
Дата: 29.06.15 19:15
Оценка: 2 (1)
Здравствуйте, neFormal, Вы писали:

F>можешь не капитанить. я трогал и системные потоки тоже.

F>я бы даже не сказал, что расходы какие-то фатальные до определённой границы.

Согласен. Как раз поэтому в большинстве случаев лёгкие потоки не нужны. Границу легко увидеть если посмотреть на графики нагрузки для Apache vs Nginx.

_>>У лёгкие потоков мы имеем маленькие накладные расходы на создание и переключение и ненулевые (а в случае Эрланга особенно) на исполнение.

F>а тут ты опять сравниваешь скорость рантайма.
F>эрланг тормозной, это все знают. и шедулинг там не самая большая проблема. основные вещи там реализованы низкоуровнево.

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

F>а что на плюсах есть хорошего для акторов?


Ну например http://www.theron-library.com или более новый http://actor-framework.org. Ещё слышал про http://sourceforge.net/projects/sobjectizer/ и https://github.com/gridem/Synca (от яндекса, но недоделанный). Это всё для обобщённого случая. А для самых простых можно вообще обойтись системными потоками с очередями.)))

_>>P.S. Кстати, лично мне как раз больше всего нравится именно модель акторов — я стараюсь именно её применять везде. Только вот на C++. И с системными и с лёгкими потоками, в зависимости от задачи.

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

Да да, о том и речь. )
Re[13]: Эрланг и все-все-все (на самом деле, не совсем)
От: Evgeny.Panasyuk Россия  
Дата: 29.06.15 19:31
Оценка:
Здравствуйте, AlexRK, Вы писали:

EP>>Если бы "параллельный" код исполнялся в одном потоке — то не было бы никакого смысла распараллеливать однопоточный — это сложнее и дороже в любом случае (как минимум нужно подключить параллельную библиотеку, добавить опции компилятора, изменить код (иногда изменения минимальны, иногда увы нет) и т.п.).

EP>>Конкуретный же код наоборот использует процессы для упрощения решения, и в общем случае без проблем может работать на одном железном потоке.
EP>>Грань вполне чёткая.
ARK>Все же не могу согласиться. Если взять какой-нибудь код, например, на Ada, где есть встроенная многопоточность, сможем ли мы сказать, какой это код — параллельный или конкурентный? Ну, может в каких-то случаях сможем. А в каких-то нет. Собственно, у меня может быть код одновременно и производительнее, и проще однопоточного. Я бы не назвал это четкой гранью.

Упрощённые критерии, отчасти по вторичным признакам:
* Если код проще с потоками, то это конкурентное программирование (которое в некоторых случаях может также давать преимущества по скорости, но необязательно).
* Если код сложнее, и без использования нескольких железных потоков такое усложнение вообще не имеет смысла — то это параллельное программирование.

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

EP>(Вообще говоря и параллельное и конкурентное программирование охватывают бОльшие области чем я описал, но для первого приближения такого описания достаточно)

Например бывают случаи где никакой однопоточной альтернативы нет в принципе, и соответственно оценки "проще/сложнее" не применимы.
Re[17]: Эрланг и все-все-все (на самом деле, не совсем)
От: alex_public  
Дата: 29.06.15 19:39
Оценка:
Здравствуйте, neFormal, Вы писали:

_>>Соответственно, если мы запускаем скажем числодробилку на лёгких потоках, то получаем отображение например 8 лёгких потоков в 8 системных (обычный пул по числу ядер) и в итоге планировщик и вся инфраструктура поддержки (то самое, чем ты там гордишься в Эрланге) лёгких потоков будут заняты исключительно обогревом воздуха. Тупо трата ресурсов в никуда без единого плюса взамен.

F>с smp, я так понимаю, эта проблема уходит.
F>выбирать между несколькими лёгкими уже просто не надо.

Эммм, причём тут мультипроцессорные машины? Или ты что-то другое имел в виду? ) Ну и даже если бы это было так, то в случае Эрланга всё равно остаётся куча мусора из-за встроенности поддержки кооперативной многозадачности в саму платформу. Кстати, в тех же реализация лёгких потоков на C++ через сопрограммы это всё контролируется руками, так что ситуация становится менее печальной. Хотя планировщик и в C++ будет отрабатывать в пустую.

_>>Да, и кстати... Если говорить о типах потоков, то в подавляющем большинстве задач полезнее как раз системные. Просто потому, что написание серверов, работающие с тысячами подключений не является сильно распространённой задачей. )))

F>свят-свят!
F>не все пишут числодробилки. много народу занимается как раз обработкой запросов юзеров.

Тут ключевым была именно высокая нагруженность сервера. Потому как большую часть современного веба (ты же его подразумевал под запросами юзеров?) занимает Apache+php, а это как раз пример реализации схемы "по системному потоку (ну или процессу — не суть) на подключение".
Re[16]: Эрланг и все-все-все (на самом деле, не совсем)
От: neFormal Россия  
Дата: 29.06.15 19:42
Оценка:
Здравствуйте, alex_public, Вы писали:

F>>эрланг тормозной, это все знают. и шедулинг там не самая большая проблема. основные вещи там реализованы низкоуровнево.

_>Да не в быстродействие языка дело. Даже если мы напишем это всё на C++, то оно всё равно будет уступать на числодробилке тупому пулу системных потоков, потому как будет исполнять ненужный код.

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

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

F>>а что на плюсах есть хорошего для акторов?

_>Ну например http://www.theron-library.com или более новый http://actor-framework.org. Ещё слышал про http://sourceforge.net/projects/sobjectizer/ и https://github.com/gridem/Synca (от яндекса, но недоделанный).

спасибо, поинтересуюсь.
...coding for chaos...
Re[16]: Эрланг и все-все-все (на самом деле, не совсем)
От: so5team https://stiffstream.com
Дата: 29.06.15 19:48
Оценка:
Здравствуйте, alex_public, Вы писали:

F>>а что на плюсах есть хорошего для акторов?


_>Ну например http://www.theron-library.com или более новый http://actor-framework.org. Ещё слышал про http://sourceforge.net/projects/sobjectizer/ и https://github.com/gridem/Synca (от яндекса, но недоделанный). Это всё для обобщённого случая. А для самых простых можно вообще обойтись системными потоками с очередями.)))


Судя по всему, Theron умер года полтора назад.
Из живых и OpenSource для C++ есть только C++ Actor Framework и SObjectizer.
Впрочем, в Wiki есть список, по которому можно судить о живости и степени свежести.

Synca не столько от Яндекса, сколько от сотрудника Яндекса В Synca только короутины используются. Ну и автор сам говорит, что у него, к сожалению, не так много времени, чтобы довести Synca до хорошего, презентабельного состояния.
Re[13]: Эрланг и все-все-все (на самом деле, не совсем)
От: Evgeny.Panasyuk Россия  
Дата: 29.06.15 19:48
Оценка: 1 (1)
Здравствуйте, neFormal, Вы писали:

EP>>Если бы "параллельный" код исполнялся в одном потоке — то не было бы никакого смысла распараллеливать однопоточный — это сложнее и дороже в любом случае (как минимум нужно подключить параллельную библиотеку, добавить опции компилятора, изменить код (иногда изменения минимальны, иногда увы нет) и т.п.).

F>поддержу AlexRK.
F>всё, что ты перечислил — это нюансы технологии.
F>весь вопрос в том, от чего ты строишь решение: от организации кода или от железа.

https://en.wikipedia.org/wiki/Concurrent_computing
Concurrent computing is related to but distinct from parallel computing, though these concepts are frequently confused,[2][3] and both can be described as "multiple processes executing during the same period of time". In parallel computing, execution literally occurs at the same instant, for example on separate processors of a multi-processor machine, with the goal of speeding up computations – parallel computing is impossible on a (single-core) single processor, as only one computation can occur at any instant (during any single clock cycle).[a] By contrast, concurrent computing consists of process lifetimes overlapping, but execution need not happen at the same instant. The goal here is to model processes in the outside world that happen concurrently, such as multiple clients accessing a server at the same time. Structuring software systems as composed of multiple concurrent, communicating parts can be useful for tackling complexity, regardless of whether the parts can be executed in parallel.[4]:1

For example, concurrent processes can be executed on a single core by interleaving the execution steps of each process via time slices: only one process runs at a time, and if it does not complete during its time slice, it is paused, another process begins or resumes, and then later the original process is resumed. In this way multiple processes are part-way through execution at a single instant, but only one process is being executed at that instant.

Concurrent computations may be executed in parallel,[2][5] for example by assigning each process to a separate processor or processor core, or distributing a computation across a network, but in general, the languages, tools and techniques for parallel programming may not be suitable for concurrent programming, and vice versa.

https://en.wikipedia.org/wiki/Parallel_computing
Parallel computing is closely related to concurrent computing – they are frequently used together, and often conflated, though the two are distinct: it is possible to have parallelism without concurrency (such as bit-level parallelism), and concurrency without parallelism (such as multitasking by time-sharing on a single-core CPU).[5][6] In parallel computing, a computational task is typically broken down in several, often many, very similar subtasks that can be processed independently and whose results are combined afterwards, upon completion. In contrast, in concurrent computing, the various processes often do not address related tasks; when they do, as is typical in distributed computing, the separate tasks may have a varied nature and often require some inter-process communication during execution.

http://talks.golang.org/2012/waza.slide#1
Concurrency is not Parallelism

Re[18]: Эрланг и все-все-все (на самом деле, не совсем)
От: neFormal Россия  
Дата: 29.06.15 19:51
Оценка:
Здравствуйте, alex_public, Вы писали:

F>>с smp, я так понимаю, эта проблема уходит.

F>>выбирать между несколькими лёгкими уже просто не надо.
_>Эммм, причём тут мультипроцессорные машины?

в соседнем сообщении написал.

_>Тут ключевым была именно высокая нагруженность сервера.

_>Потому как большую часть современного веба (ты же его подразумевал под запросами юзеров?)

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

_>занимает Apache+php, а это как раз пример реализации схемы "по системному потоку (ну или процессу — не суть) на подключение".


статистикой не интересовался, но надеюсь, что это не так, потому что адово медленно.
апач много лет уже не в тренде.
...coding for chaos...
Re[17]: Эрланг и все-все-все (на самом деле, не совсем)
От: so5team https://stiffstream.com
Дата: 29.06.15 19:52
Оценка: 1 (1)
Здравствуйте, neFormal, Вы писали:

F>но в нативе всё равно балансировка лёгких потоков без поддержки ядра будет фиговой, потому что их не прервать.


Зависит от платформы. На Windows 64-bit есть User-Mode Scheduling.
Re[14]: Эрланг и все-все-все (на самом деле, не совсем)
От: neFormal Россия  
Дата: 29.06.15 19:55
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>

EP>https://en.wikipedia.org/wiki/Concurrent_computing
EP>https://en.wikipedia.org/wiki/Parallel_computing
EP>http://talks.golang.org/2012/waza.slide#1
EP>Concurrency is not Parallelism


не, ну какая разница, кто как что называет? суть от этого не меняется.
у тебя есть поток, на нём что-то выполняется. общается ли оно с соседними потоками — это уже детали, а не основа основ.
...coding for chaos...
Re[18]: Эрланг и все-все-все (на самом деле, не совсем)
От: neFormal Россия  
Дата: 29.06.15 19:58
Оценка:
Здравствуйте, so5team, Вы писали:

F>>но в нативе всё равно балансировка лёгких потоков без поддержки ядра будет фиговой, потому что их не прервать.

S>Зависит от платформы. На Windows 64-bit есть User-Mode Scheduling.

не нашёл противоречий.
...coding for chaos...
Re[15]: Эрланг и все-все-все (на самом деле, не совсем)
От: alex_public  
Дата: 29.06.15 20:07
Оценка:
Здравствуйте, Mamut, Вы писали:

M>Ну то есть все остальное приходится закатывать вручную — изоляцию потоков, разделение данных, управление потоками и т.п. Ты смотри. Как раз то, о чем я говорил в изначальном сообщении


Кстати, насчёт вручную... Ну просто не могу не задать один коротенький практический вопрос. Вот есть у меня такой код (из реального теста):
int F(int){...}
int main()
{
    auto d=LoadData();
    #pragma omp parallel for
    for(int i=0; i<d.size(); i++) d[i]=F(d[i]);
    SaveData(d);
}

который очевидно выполняет некую многопоточную обработку массива данных, с использованием всех ресурсов процессора. И я даже не буду просить написать код работающий быстрее (зачем смешить людей). Я предложу всего лишь написать на Эрланге код с той же функциональностью, но при этом более простой и удобный в написание, чем данный пример. Ведь на Эрланге у нас же не требуется "закатывать солнце вручную" для реализации многопоточности, не так ли? )
Re[14]: Эрланг и все-все-все (на самом деле, не совсем)
От: AlexRK  
Дата: 29.06.15 20:21
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>

EP>https://en.wikipedia.org/wiki/Concurrent_computing
EP>https://en.wikipedia.org/wiki/Parallel_computing
EP>http://talks.golang.org/2012/waza.slide#1
EP>Concurrency is not Parallelism


Да, что-то в этом есть. Однако, с точки зрения программного кода мы, получается, вообще не можем сказать, что у нас за программа вышла — Parallel или Concurrent. Для этого мы должны знать детали конкретной платформы. А то вдруг наподключали заголовков Intel TBB, объявили все параллелизмом, а потом глядь — а процессор-то один. А есть еще всякие штуки типа High Performance Fortran, который _сам_ распараллеливает чисто последовательные алгоритмы (ну, не все, конечно, но это в данном случае не важно).

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

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

Не знаю, в общем. Вот таски в Ada — это средства для параллелизма или конкурентности?
Отредактировано 29.06.2015 20:25 AlexRK . Предыдущая версия .
Re[16]: Эрланг и все-все-все (на самом деле, не совсем)
От: Evgeny.Panasyuk Россия  
Дата: 29.06.15 20:28
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Кстати, насчёт вручную... Ну просто не могу не задать один коротенький практический вопрос. Вот есть у меня такой код (из реального теста):

_>
_>int F(int){...}
_>int main()
_>{
_>    auto d=LoadData();
_>    #pragma omp parallel for
_>    for(int i=0; i<d.size(); i++) d[i]=F(d[i]);
_>    SaveData(d);
_>}
_>


На ФВП красивее, и без вмешательства в язык (что мне и не нравится в OpenMP
Автор: Evgeny.Panasyuk
Дата: 29.03.13
):
int F(int){...}
int main()
{
    auto d=LoadData();
    parallel_transform(begin(d), end(d), begin(d), F);
    SaveData(d);
}

В контексте C++ основное (и возможно единственное) преимущество OpenMP — это доступность из коробки в популярных средах.
Re[17]: Эрланг и все-все-все (на самом деле, не совсем)
От: alex_public  
Дата: 29.06.15 20:31
Оценка:
Здравствуйте, neFormal, Вы писали:

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

F>при шедулере на ядро(как в erlang smp) и тем же самым одним лёгким потоков расходы будут ещё более ничтожны.

Ну даже если мы сумеем сделать их маленькими (в Эрланге кстати не выйдет, но в некоторых других платформах можно попробовать), то остаётся ключевой вопрос — а зачем нам все эти мучения то? ))) Ведь никаких преимуществ то относительно пула системных потоков нам это не даст.

F>но в нативе всё равно балансировка лёгких потоков без поддержки ядра будет фиговой, потому что их не прервать.


И как раз поэтому оно быстрое. ) Да и кстати, зачем тебе там прерывания, если лёгкие потоки в C++ используются совместно с асинхронным IO?
Re[19]: Эрланг и все-все-все (на самом деле, не совсем)
От: alex_public  
Дата: 29.06.15 20:44
Оценка:
Здравствуйте, neFormal, Вы писали:

_>>Эммм, причём тут мультипроцессорные машины?

F>в соседнем сообщении написал.

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

F>вообще нет. у меня вот долгие прямые коннекты, кастомный протокол и лёгкие эрланговские треды.

F>и высокая нагруженность достигается лишь активностью юзеров.

Так это всё равно получается высоконагруженный сервер) Тут Эрланг действительно подходит. Как впрочем и многие другие языки. )

_>>занимает Apache+php, а это как раз пример реализации схемы "по системному потоку (ну или процессу — не суть) на подключение".

F>статистикой не интересовался, но надеюсь, что это не так, потому что адово медленно.
F>апач много лет уже не в тренде.

Опять же сайты с высокой посещаемость не являются большинством в вебе. )
Re[15]: Эрланг и все-все-все (на самом деле, не совсем)
От: Evgeny.Panasyuk Россия  
Дата: 29.06.15 20:51
Оценка:
Здравствуйте, AlexRK, Вы писали:

ARK>Да, что-то в этом есть. Однако, с точки зрения программного кода мы, получается, вообще не можем сказать, что у нас за программа вышла — Parallel или Concurrent. Для этого мы должны знать детали конкретной платформы. А то вдруг наподключали заголовков Intel TBB, объявили все параллелизмом, а потом глядь — а процессор-то один.


Тут важно то, что если бы Intel TBB не давал преимуществ на многоядерных машинах — то никто бы его и не использовал для параллельных вычислений. Зачем усложнять код, ограничивать семантику операций там где это не даёт преимуществ?

ARK>А есть еще всякие штуки типа High Performance Fortran, который _сам_ распараллеливает чисто последовательные алгоритмы (ну, не все, конечно, но это в данном случае не важно).


Это есть и в C++ компиляторах: MSVC, GCC. И заметь — это называется авто-параллелизацией, а не авто-конкурентизацией или авто-многопотокизацией.

ARK>Не знаю, в общем. Вот таски в Ada — это средства для параллелизма или конкурентности?


После беглого просмотра — это скорее средства конкурентности (которые в том числе могут быть основой для параллельных решений). Кстати, насколько я вижу, в Ada обмен сообщениями ближе к CSP, чем у Erlang.
Отредактировано 29.06.2015 20:54 Evgeny.Panasyuk . Предыдущая версия .
Re[15]: Эрланг и все-все-все (на самом деле, не совсем)
От: so5team https://stiffstream.com
Дата: 29.06.15 20:51
Оценка:
Здравствуйте, AlexRK, Вы писали:

ARK>Не знаю, в общем. Вот таски в Ada — это средства для параллелизма или конкурентности?


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

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

А вот уже параметры инструмента могут определять, насколько он пригоден или не пригоден к решению тех или иных задач. Например, короутины хороши при работе с async IO, но доставляют много хлопот в вычислительных задачах. Процессы хороши в вычислительных задачах, но не подходят для модели "один запрос, одна задача". Легкие процессы Erlang-а хороши когда стоимость обслуживания одной активности в VM нас устраивает. Но не подходят, если нужно выжимать такты и биты.
Re[17]: Эрланг и все-все-все (на самом деле, не совсем)
От: alex_public  
Дата: 29.06.15 20:55
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>На ФВП красивее, и без вмешательства в язык (что мне и не нравится в OpenMP
Автор: Evgeny.Panasyuk
Дата: 29.03.13
):

EP>
EP>int F(int){...}
EP>int main()
EP>{
EP>    auto d=LoadData();
EP>    parallel_transform(begin(d), end(d), begin(d), F);
EP>    SaveData(d);
EP>}
EP>

EP>В контексте C++ основное (и возможно единственное) преимущество OpenMP — это доступность из коробки в популярных средах.

1. Только если parallel_transform умеет принимать лямбду (а не std::function), иначе это не подойдёт для распараллеливания прямо в коде (без выноса в функцию — обычно то просто цикл с неким кодом стоит).
2. Библиотечку надо ещё собирать и подключать... Кстати, а какую ты тут имел в виду? )
3. А что скажешь насчёт openacc? )
Re[18]: Эрланг и все-все-все (на самом деле, не совсем)
От: neFormal Россия  
Дата: 29.06.15 21:01
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Ну даже если мы сумеем сделать их маленькими (в Эрланге кстати не выйдет


это почему это? какие там такие большие расходы?

_>но в некоторых других платформах можно попробовать), то остаётся ключевой вопрос — а зачем нам все эти мучения то? ))) Ведь никаких преимуществ то относительно пула системных потоков нам это не даст.


для числодробилок — никаких.
но я говорю, если использовать общий механизм создания потоков.

F>>но в нативе всё равно балансировка лёгких потоков без поддержки ядра будет фиговой, потому что их не прервать.

_>И как раз поэтому оно быстрое. ) Да и кстати, зачем тебе там прерывания, если лёгкие потоки в C++ используются совместно с асинхронным IO?

для равномерного выполнения и балансировки.
опять же никакой поток не сможет заблокировать всю работу.
...coding for chaos...
Re[20]: Эрланг и все-все-все (на самом деле, не совсем)
От: neFormal Россия  
Дата: 29.06.15 21:08
Оценка: +1
Здравствуйте, alex_public, Вы писали:

_>Нуу так тут получается, что собственно SMP вообще ни при чём.


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

F>>вообще нет. у меня вот долгие прямые коннекты, кастомный протокол и лёгкие эрланговские треды.

F>>и высокая нагруженность достигается лишь активностью юзеров.
_>Так это всё равно получается высоконагруженный сервер) Тут Эрланг действительно подходит. Как впрочем и многие другие языки. )

на эрланге это получается заметно проще. относительно плюсов, я бы сказал, на порядок, а то и два.
это заслуга как языка, так и модели использования потоков.
если не ставить целью сделать максимально(именно "максимально") эффективный относительно ресурсов сервер, то эрланг — хороший выбор.
...coding for chaos...
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.