Хехехе. После долгих и упорных экспериментов, у нас есть штуковина, которая в round-robin режиме успевает обойти 1 млн тредов в секунду, и выдать каждому по 0.6 мкс процессорного времени :))) (на одном амд-шном ядре
( Read more... )
А собственно что делает переключение контекстов, сохраняет/восстанавливает регистры? 500 тактов на сохранение и 500 на загрузку на x86 как-то много, кажется. (disclaimer: практического опыта массового переключения контекстов не имею)
Штатный ядерный scheduler что в винде, что в линухе, работает еще на порядки медленнее (не 0.3 мкс, а 50-100), из-за переключений kernel/user mode, сбросов TLB, и всякого такого прочего.
Проверяется очень просто - запускаешь 15к тредов, которые неспешно на низком приоритете крутят while(true) sleep(0), и машина уходит в даун.
И вот что реально интересно - так это сколько, в этом тесте было одновременно-работающих тредов? Ну рас уж оно в round-robin режиме работало. А еще более интересно - если тестировалось, конечно - при каком количестве переключений, и/или при каком количестве одновременных тредов, производительность _вычислений_ оказывалась максимальной (т.е. при каких условиях, всякие обслуживающие накладные расходы, будут наименее существенны).
Кстати, это не User-Mode Scheduling заюзался под Виндой, часом? Хорошая штука, оказывается, коли так. (я не юзал, если что). Или тут нечто более хитрое?
>>Все работали, крутили цикл и считали счетчики. Т.е. все треды работали. ОК. А "все" это сколько-то? Если ж там round-robin - то может быть и 3 треда и 1000000 тредов.
>>Производительность максимальная при кол-ве тредов равно кол-ву ядер, это вроде очевидно. Ты ведь изначально говорил про _одно_ ядро amd-машины. Вот я про одно ядро и спрашиваю. Хотя походу спросил не совсем верно. Смотри, вот на допустим на графике есть точка "А" - точка спада ниже приемлемого уровня - вот примерно где она у тебя находится - мне и интересно. Ну т.е, понятно, что у тебя график зависимости несколько другой. Но по аналогии.
( ... )
>>Нет, не файберы, все проще Почитал ветку. Т.е. это все чисто для всяких интерпретируемых, managed, и близких тому, языков? Ну или языков, в бинарники которых легко, безопастным способом, повставлять кучу yeld-ов? И тот исходник на питоне - это тест реально работающего шедулера? (Если что - я с питоном, пока что, на Вы, а со stackless - так вообще дела не имел. Потому как-то не совсем четко представляю, смысл того питоновского кода. По крайней мере аналога yeld, я там не заметил, а значит шедулер все разруливает самостоятельно. Так?) Если так - то ОК - понял.
Логично. Если целью является производство большого количества мусора, то это самая подходящая технология :-) В Питоне, кстати, уже тоже придумано понятие генераторов, с выдачей значений по yield.
Comments 57
500 тактов на сохранение и 500 на загрузку на x86 как-то много, кажется. (disclaimer: практического опыта массового переключения контекстов не имею)
Reply
Проверяется очень просто - запускаешь 15к тредов, которые неспешно на низком приоритете крутят while(true) sleep(0), и машина уходит в даун.
Reply
Reply
Вообще, мне кажется, главная беда в том, что L1/L2 кэш смывается непрерывно.
Reply
Reply
Reply
И вот что реально интересно - так это сколько, в этом тесте было одновременно-работающих тредов? Ну рас уж оно в round-robin режиме работало.
А еще более интересно - если тестировалось, конечно - при каком количестве переключений, и/или при каком количестве одновременных тредов, производительность _вычислений_ оказывалась максимальной (т.е. при каких условиях, всякие обслуживающие накладные расходы, будут наименее существенны).
Кстати, это не User-Mode Scheduling заюзался под Виндой, часом? Хорошая штука, оказывается, коли так. (я не юзал, если что). Или тут нечто более хитрое?
Reply
Производительность максимальная при кол-ве тредов равно кол-ву ядер, это вроде очевидно.
Нет, не файберы, все проще
Reply
Т.е. все треды работали. ОК. А "все" это сколько-то? Если ж там round-robin - то может быть и 3 треда и 1000000 тредов.
>>Производительность максимальная при кол-ве тредов равно кол-ву ядер, это вроде очевидно.
Ты ведь изначально говорил про _одно_ ядро amd-машины. Вот я про одно ядро и спрашиваю. Хотя походу спросил не совсем верно. Смотри, вот на допустим на графике есть точка "А" - точка спада ниже приемлемого уровня - вот примерно где она у тебя находится - мне и интересно. Ну т.е, понятно, что у тебя график зависимости несколько другой. Но по аналогии.
( ... )
Reply
Почитал ветку. Т.е. это все чисто для всяких интерпретируемых, managed, и близких тому, языков? Ну или языков, в бинарники которых легко, безопастным способом, повставлять кучу yeld-ов? И тот исходник на питоне - это тест реально работающего шедулера? (Если что - я с питоном, пока что, на Вы, а со stackless - так вообще дела не имел. Потому как-то не совсем четко представляю, смысл того питоновского кода. По крайней мере аналога yeld, я там не заметил, а значит шедулер все разруливает самостоятельно. Так?)
Если так - то ОК - понял.
Reply
Reply
Один из юзкейсов - вот http://lindenlab.wordpress.com/2006/05/05/microthreading-mono/
Reply
Reply
Reply
Reply
если серьезно, то буду тестить.
Reply
Leave a comment