我有一个处理大量数据的应用程序。
当工作集超过 L2(L3) 缓存时,性能会急剧下降。
我想使用预取数据来解决部分问题。
我想利用在超线程 CPU 上运行的多线程代码共享一个核心和缓存这一事实。
第一个线程 (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;
两个线程同步执行,工作线程全速运行,获取线程等待信号。
有没有办法强制两个线程在超线程 CPU 的同一个内核中运行?
我正在使用德尔福 XE2。
PS 我知道如何使用 CPUID 指令检测 CPU 是否支持超线程。