для изменения произвольно заданного набора страниц
Так, какие страницы ты меняешь, те и инвалидируй.
Или ты думаешь, что их может быть так много, что эта инвалидация будет дольше, чем инвалидация всего TLB + последующие TLB-промахи?
По-первых, есть документация (Intel SDM, глава 4.10 в 3-м томе, вот отрывок, как раз по теме).
Во-вторых, ты не знаешь что у тебя в TLB находится. Может, ни одна из твоих страниц, а может все. Поэтому вычислить вряд ли получится.
Можно лишь провести миллион (условно) тестов на разных машинах с замером скорости. И эмпирически вывести порог кол-ва изменяемых страниц, выше которого есть смысл чистить весь TLB-кэш.
Далее, пока не понятно, сколько времени нужно на очистку всего TLB. Ни у Агнера, ни на uops нет инфы ни о скорости INVPCID, ни о скорости MOV CRx. Очень может быть, что она сильно варьируется.
Ну и, опять же, если у тебя, скажем, 1024 записей в TLB, то неизвестно, к какой доле из них ты будешь обращаться повторно. Может, к 1000, а может, к 100. А там ещё и несколько уровней их (как у кэша процессора) с разной скоростью доступа.
ИМХО, только тестить :))
И подумать: а реально ли нужен ли это гемор?
Ну и ещё можно, конечно, заморочиться и гнянуть, как это реализовано в разных ОС. В Linux, скажем :)