Сообщение Re[12]: Mногопоточность: C++ vs Erlang vs другие от 05.06.2015 16:16
Изменено 05.06.2015 16:17 Evgeny.Panasyuk
Здравствуйте, vdimas, Вы писали:
EP>>Это понятно, тут со stateless хорошо то что они требуют ровно столько памяти, сколько требуется. Но вопрос-то был про другое.
EP>>Тем не менее, я без проблем запускал 400k stackful корутин на ноутбуке
V>Я уже читал твои отчеты (познавательно, кста) и не согласен с тем, чтобы уменьшать стек под корутину. Ведь не знаешь же, сколько реально стека потребуется для каких-нить промежуточных вычислений.
Да, это одна из основных проблем stackful корутин. Не размер стэка когда корутина спит, а именно то что между yield'ами может понадобится нырнуть поглубже в стэк. Это конечно далеко не всегда будет проблемой, но учитывать обязательно.
Тут вижу несколько вариантов:
1. Split Stacks — то есть поддержка "разорванных" стэков компилятором+рантаймом.
2. На x64 резервировать требуемый объём адресного пространства под стэк, делать commit на страницу, при росте добавлять, а при уменьшении возвращать.
3. Тяжёлые вычисления между yield'ами делать в отдельной корутине с большим стэком (в том же потоке), то есть:
EP>>Это понятно, тут со stateless хорошо то что они требуют ровно столько памяти, сколько требуется. Но вопрос-то был про другое.
EP>>Тем не менее, я без проблем запускал 400k stackful корутин на ноутбуке
Автор: Evgeny.Panasyuk
Дата: 30.11.13
, причём это далеко не предел.Дата: 30.11.13
V>Я уже читал твои отчеты (познавательно, кста) и не согласен с тем, чтобы уменьшать стек под корутину. Ведь не знаешь же, сколько реально стека потребуется для каких-нить промежуточных вычислений.
Да, это одна из основных проблем stackful корутин. Не размер стэка когда корутина спит, а именно то что между yield'ами может понадобится нырнуть поглубже в стэк. Это конечно далеко не всегда будет проблемой, но учитывать обязательно.
Тут вижу несколько вариантов:
1. Split Stacks — то есть поддержка "разорванных" стэков компилятором+рантаймом.
2. На x64 резервировать требуемый объём адресного пространства под стэк, делать commit на страницу, при росте добавлять, а при уменьшении возвращать.
3. Тяжёлые вычисления между yield'ами делать в отдельной корутине с большим стэком (в том же потоке), то есть:
coroutine_with_small_stack([&]
{
Data x;
yield();
auto result = coroutine_with_large_stack_do_now([&]
{
retrun heavy_computation_without_yield(x);
});
yield();
});
Re[12]: Mногопоточность: C++ vs Erlang vs другие
Здравствуйте, vdimas, Вы писали:
EP>>Это понятно, тут со stateless хорошо то что они требуют ровно столько памяти, сколько требуется. Но вопрос-то был про другое.
EP>>Тем не менее, я без проблем запускал 400k stackful корутин на ноутбуке
V>Я уже читал твои отчеты (познавательно, кста) и не согласен с тем, чтобы уменьшать стек под корутину. Ведь не знаешь же, сколько реально стека потребуется для каких-нить промежуточных вычислений.
Да, это одна из основных проблем stackful корутин. Не размер стэка когда корутина спит, а именно то что между yield'ами может понадобится нырнуть поглубже в стэк. Это конечно далеко не всегда будет проблемой, но учитывать обязательно.
Тут вижу несколько вариантов:
1. Split Stacks — то есть поддержка "разорванных" стэков компилятором+рантаймом.
2. На x64 резервировать требуемый объём адресного пространства под стэк, делать commit на страницу, при росте добавлять, а при уменьшении возвращать.
3. Тяжёлые вычисления между yield'ами делать в отдельной корутине с большим стэком (в том же потоке), то есть:
EP>>Это понятно, тут со stateless хорошо то что они требуют ровно столько памяти, сколько требуется. Но вопрос-то был про другое.
EP>>Тем не менее, я без проблем запускал 400k stackful корутин на ноутбуке
Автор: Evgeny.Panasyuk
Дата: 30.11.13
, причём это далеко не предел.Дата: 30.11.13
V>Я уже читал твои отчеты (познавательно, кста) и не согласен с тем, чтобы уменьшать стек под корутину. Ведь не знаешь же, сколько реально стека потребуется для каких-нить промежуточных вычислений.
Да, это одна из основных проблем stackful корутин. Не размер стэка когда корутина спит, а именно то что между yield'ами может понадобится нырнуть поглубже в стэк. Это конечно далеко не всегда будет проблемой, но учитывать обязательно.
Тут вижу несколько вариантов:
1. Split Stacks — то есть поддержка "разорванных" стэков компилятором+рантаймом.
2. На x64 резервировать требуемый объём адресного пространства под стэк, делать commit на страницу, при росте добавлять, а при уменьшении возвращать.
3. Тяжёлые вычисления между yield'ами делать в отдельной корутине с большим стэком (в том же потоке), то есть:
coroutine_with_small_stack([&]
{
Data x;
yield();
auto result = coroutine_with_large_stack_do_now([&]
{
return heavy_computation_without_yield(x);
});
yield();
});