Я реализовал кражу работы для HLL с именем PARLANSE , а не C на x86. PARLANSE используется ежедневно для создания символических параллельных программ производства в масштабе миллиона строк.
Как правило, вы сохраняете регистры как продолжения, так и «потомка».
Учтите, что ваш компилятор может увидеть вычисление в f () и увидеть то же вычисление в g (), и может поднять это вычисление до точки непосредственно перед порождением, и поместить это вычисление в регистр, который f () и g () использовать как в подразумеваемом параметре.
Да, это предполагает сложный компилятор, но если вы используете тупой компилятор, который не оптимизирует, почему вы пытаетесь идти параллельно для скорости?
В частности, однако, ваш компилятор может организовать регистры пустыми до вызова spawn, если он понимает, что означает spawn. Тогда ни продолжение, ни ребенок не должны сохранять регистры. (Компилятор PARLANSE фактически делает это).
То есть, сколько нужно сохранить, зависит от того, насколько ваш компилятор готов помочь, и это зависит от того, знает ли он, что на самом деле делает spawn.
Ваш местный дружественный компилятор C, вероятно, не знает о вашей реализации spawn. Так что либо вы делаете что-то для принудительного сброса регистра (не спрашивайте меня, это ваш компилятор), либо вы смирились с тем, что лично вы не знаете, что находится в регистрах, и ваша реализация сохраняет их все для безопасности.
Если объем порожденной работы значительный, возможно, не имеет значения, сохраните ли вы все регистры. Тем не менее, x86 (и другие современные архитектуры), кажется, имеют огромное количество состояний, в основном в векторных регистрах, которые могут использоваться; в прошлый раз, когда я смотрел, это было больше 500 байт ~ ~ 100 записей в память, чтобы сохранить их, и ИМХО, это чрезмерная цена. Если вы не верите, что эти регистры будут передаваться из родительского потока в порожденный поток, вы можете поработать над созданием порождения без регистров.
Если вы порождаете рутинные пробуждения с использованием стандартного механизма продолжения, который вы изобрели, то у вас есть вопросы о том, проходят ли ваши продолжения большое состояние регистра или нет. Та же проблема, те же решения, что и для spawn; компилятор должен помочь, или вы лично должны вмешаться.
Вы найдете это очень весело.
[Если вы хотите сделать его действительно интересным, попробуйте нарезать потоки на время, если они углубляются в вычисления без случайного результата, вызывающего голодание потока. Теперь вы наверняка должны сохранить все состояние. Мне удалось заставить PARLANSE реализовать процесс порождения без сохранения регистров, но у меня было время на сохранение / восстановление полного регистра состояния путем сохранения полного состояния во временном интервале и продолжения в специальном месте, которое пополняло все регистры, прежде чем оно передало управление временное местоположение ПК].