Joh*_*ica 4 delphi multithreading hyperthreading delphi-xe2
我有一个处理大量数据的应用程序.
当工作集超过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;
Run Code Online (Sandbox Code Playgroud)
两个线程都以锁步方式执行,工作线程以全速运行,而获取线程等待信号.
有没有办法强制两个线程在HyperThreaded CPU上的同一核心中运行?
我正在使用Delphi XE2.
PS我知道如何使用CPUID指令检测CPU是否支持超线程.
Dav*_*nan 10
您只需调用SetThreadAffinityMask
将句柄传递给您希望约束的线程,以及目标处理器的处理器掩码.可以使用Handle
属性获取线程的句柄.
当然,您必须了解如何将两个线程放在同一个物理内核上.在超线程机器上,第一个N/2逻辑处理器是物理内核,第二个N/2逻辑处理器是它们的超线程处理器.因此,如果您有一个四核,即8个逻辑处理器,您希望将线程放在逻辑处理器0和4,或1和5,或2和6,或3和7上.
作为一般建议,您应该避免设置硬亲和面具.调度线程很难,系统通常比你更好,因为它可以看到所有的线程.你只能看到你的线程.您可以考虑SetThreadIdealProcessor
作为替代方案.