Планирование одного потока на разных процессорах — нужно очистить кеш?

Когда вы планируете один поток для разных процессоров, нужно ли каждый раз очищать кеш? Если кеш не очищается, не может ли произойти следующее:

Предположим, у вас есть следующий (псевдо) код, выполняемый двумя процессорами, P1 и P2.

     1. foo() {
     2. int x=5;
     3. x=10;
     4. print x;
     5. }

Первоначально поток запланирован на P1, который выполняет строки 1 и 2 и сохраняет 5 в своем кеше для ячейки памяти x (в стеке).

Затем поток планируется на P2, который выполняет строку 3 и сохраняет 10 в своем кеше для ячейки памяти x.

Наконец, поток снова назначается на P1, и выполнение строки 4 выводит 5 (значение x в кэше P1).

Тем не менее, мы явно ожидаем, что будет напечатано 10.


person user1886387    schedule 07.12.2012    source источник


Ответы (1)


Да, кэши/регистры процессора необходимо будет обновить или, по крайней мере, сбросить в основную память, чтобы поток мог получить свою недавнюю память, если он мигрировал на другое ядро/процессор.

К счастью, распространенные серверные/настольные платформы, для которых мы обычно пишем код, имеют когерентный кэш, так что аппаратное обеспечение заботится об этом. всей магии, чтобы это работало правильно, и операционной системе в любом случае необходимо убедиться, что надлежащая память, предоставленная потоку/процессу, доступна везде, где операционная система решает запустить этот поток. Это не та задача, о которой должен беспокоиться код приложения.

В случае, если вы работаете на платформе, которая не когерентна с кешем, вы, вероятно, знаете, и, скорее всего, используемая вами библиотека ОС/потоков позаботится о правильном обновлении кешей, если ОС решит перенести поток на другой процессор.

person nos    schedule 07.12.2012