У меня есть приложение, которое обрабатывает много данных.
Когда рабочий набор превышает производительность кеша 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.
Я заинтересован в том, чтобы делать это, но не устанавливая жесткую близость к определенному ядру. Я хочу сказать ядру, запланировать ThreadA и ThreadB на любом ядре, просто убедитесь, что это одно и то же ядро. – ahcox