Не понятно почему между отправкой запроса invalidate и его приемом на втором ядре проходит так много операций. Это разве нормально иметь такую задержку во взаимодействии ядер?
Некрокомментарий (в надежде, что может быть кто-то ответит). Евгений, во-первых, спасибо большое за лекции. Очень интересные. Вопрос следующий. Почему проектировщики решили работать со сложными барьерами, вместо того чтобы заставить ядро при обращении к линии в статусе Shared проверять Invalidated queue на присутствие в ней этой линии? Издержки на проверку слишком высокие и превышают замедление всех учавствующих ядер? В вашем примере это было бы так: Тайминг 16:09 - выполняется assert(a==1) вот здесь ядро сначала смотрит в Invalidated queue, видит там запрос на инвалидацию "a", выполняет его и проблемы нет, не так ли? Остальные ядра при этом работают и никого не ждут. Попутно устранилась бы протечка абстракции наверх и сильно бы упростилась жизнь на верхних уровнях. Например проблема с futex_wait() просто бы не возникла. Мне кажется по цене выигрыша решение стоит некоторого замедления одного ядра?
Пример довольно абстрактный, возможно в некоторых архитектурах оно так и происходит либо не соотносится с реальностью + не забывай что современные CPU, суперскалярные и могут выполнять сразу несколько инструкций одновременно (Instuction Level Parallelism) Пример который описан не происходит на архитектурах со стронг моделью памяти как например x86
Теперь когда меня на собеседовании спросят про volatile я перескажу эту лекцию)
наконец то хорошее объяснение на русском
какой мошный урок, столко нового узнал, вот был бы шанс удаленна учиться в этом курсе :)
Не понятно почему между отправкой запроса invalidate и его приемом на втором ядре проходит так много операций. Это разве нормально иметь такую задержку во взаимодействии ядер?
Добавьте видео на страницу курса
Некрокомментарий (в надежде, что может быть кто-то ответит).
Евгений, во-первых, спасибо большое за лекции. Очень интересные.
Вопрос следующий. Почему проектировщики решили работать со сложными барьерами, вместо того чтобы заставить ядро при обращении к линии в статусе Shared проверять Invalidated queue на присутствие в ней этой линии? Издержки на проверку слишком высокие и превышают замедление всех учавствующих ядер?
В вашем примере это было бы так:
Тайминг 16:09 - выполняется assert(a==1) вот здесь ядро сначала смотрит в Invalidated queue, видит там запрос на инвалидацию "a", выполняет его и проблемы нет, не так ли? Остальные ядра при этом работают и никого не ждут.
Попутно устранилась бы протечка абстракции наверх и сильно бы упростилась жизнь на верхних уровнях. Например проблема с futex_wait() просто бы не возникла. Мне кажется по цене выигрыша решение стоит некоторого замедления одного ядра?
Пример довольно абстрактный, возможно в некоторых архитектурах оно так и происходит либо не соотносится с реальностью + не забывай что современные CPU,
суперскалярные и могут выполнять сразу несколько инструкций одновременно (Instuction Level Parallelism)
Пример который описан не происходит на архитектурах со стронг моделью памяти как например x86