我有一个处理大量数据的应用程序。
当工作集超过L2(L3)缓存时,性能会急剧下降。
我想通过预取数据来解决部分问题。
我想利用多线程代码在超线程CPU上运行时共享核心和缓存的事实。
第一个线程(A)是工作线程。
第二个线程(B)预取数据。
如果我可以强制两个线程在同一个核心上执行,我就可以让线程(B)先行运行并获取数据。
以下是伪代码示例。
当工作集超过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上强制两个线程在同一个核心上运行?
我正在使用Delphi XE2。
P.S. 我知道如何使用CPUID指令检测CPU是否支持超线程。