2013-10-13 3 views
4

У меня есть приложение, которое обрабатывает много данных.
Когда рабочий набор превышает производительность кеша L2 (L3), резко падает.Есть ли способ заставить два потока выполнить на одном ядре?

Я хочу исправить часть этого, используя предварительную выборку данных.

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

Первая нить (A) - рабочая нить.
Второй поток (B) выполняет предварительную выборку данных.

Если я могу заставить оба потока выполнить на одном ядре, я могу запустить поток (B) и получить данные.
Вот как он будет выглядеть в псевдокоде.

procedure TWorkerThread.Execute; 
begin 
    Node:= WalkTheDataTree.GetNode; 
    Dowork(Node.MyData); 
    SyncWithThreadB; 
end; 

procedure TFetchThread.Execute; 
begin 
    WaitForThreadA; 
    Node:= WalkTheDataTree_5_nodes_Ahead_of_A.GetNode; //Prefetch data. 
end; 

Оба потока выполняются затвором, при этом рабочий поток работает на полной скорости, а поток выборки ожидает сигнал.

Есть ли способ заставить два потока работать в одном ядре на процессоре HyperThreaded?

Я использую Delphi XE2.

P.S. Я знаю, как определить, поддерживает ли процессор гиперпоточность с использованием инструкции CPUID.

+0

Я заинтересован в том, чтобы делать это, но не устанавливая жесткую близость к определенному ядру. Я хочу сказать ядру, запланировать ThreadA и ThreadB на любом ядре, просто убедитесь, что это одно и то же ядро. – ahcox

ответ

10

Вы просто вызываете SetThreadAffinityMask, передавая ручку нити, которую вы хотите ограничить, и маску процессора для целевого процессора. Ручку нити можно получить, используя свойство Handle.

Конечно, вам нужно понять, как получить два потока на одном физическом ядре. На гиперпотоковой машине первые N/2 логические процессоры являются физическими ядрами, а второй N/2 логические процессоры являются их гиперпотоковыми аналогами. Поэтому, если у вас есть четырехъядерный процессор, то есть 8 логических процессоров, вы хотите поместить свои потоки на логические процессоры 0 и 4 или 1 и 5 или 2 и 6 или 3 и 7.

Как общий совет, вам следует избегать установки жестких масок сродства. Планирование потоков жестко, и система обычно делает это лучше, чем вы, потому что он может видеть все потоки. Вы можете видеть только свои темы. В качестве альтернативы вы можете рассмотреть SetThreadIdealProcessor.

+0

Да, это сработало как шарм. – Johan

Смежные вопросы