gpt4 book ai didi

multithreading - 有没有办法强制两个线程在同一个核心上执行?

转载 作者:行者123 更新时间:2023-12-03 15:19:59 25 4
gpt4 key购买 nike

我有一个处理大量数据的应用程序。
当工作集超过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。

附注我知道如何使用CPUID指令检测CPU是否支持超线程。

最佳答案

您只需调用 SetThreadAffinityMask将句柄传递给您想要约束的线程,以及目标处理器的处理器掩码。线程的句柄可以使用 Handle 获取属性。

当然,您必须了解如何让两个线程进入同一个物理核心。在超线程计算机上,前 N/2 个逻辑处理器是物理核心,第二个 N/2 逻辑处理器是其超线程对应部分。因此,如果您有一个四核,即 8 个逻辑处理器,您希望将线程放在逻辑处理器 0 和 4、或 1 和 5、或 2 和 6、或 3 和 7 上。

作为一般建议,您应该避免设置硬亲和性掩码。调度线程很困难,系统通常比您做得更好,因为它可以看到所有线程。您只能看到您的线程。您可以考虑SetThreadIdealProcessor作为替代方案。

关于multithreading - 有没有办法强制两个线程在同一个核心上执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19345780/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com