X86 当线程可能交换内核时,如何正确使用TSX-NI(HLE和RTM)?

X86 当线程可能交换内核时,如何正确使用TSX-NI(HLE和RTM)?,x86,cpu,affinity,context-switch,intel-tsx,X86,Cpu,Affinity,Context Switch,Intel Tsx,英特尔的事务同步扩展(TSX-NI)似乎是基于每个CPU工作的 这既适用于\u interloctedxxx\u HLE{Acquire,Release}硬件锁删除功能(HLE),也适用于\u xbegin/\u xend/etc.受限事务内存(RTM)功能 在多核系统上使用这些功能的“正确”方式是什么? 考虑到它们的正确性保证,我假设我只需要担心这里的性能 那么,考虑到线程可能会突然切换内核,因此这些指令可能需要返回到较慢的代码路径,我应该如何构造和编写代码,以使代码具有最佳性能呢 例如,我应

英特尔的事务同步扩展(TSX-NI)似乎是基于每个CPU工作的

这既适用于
\u interloctedxxx\u HLE{Acquire,Release}
硬件锁删除功能(HLE),也适用于
\u xbegin
/
\u xend
/etc.受限事务内存(RTM)功能

在多核系统上使用这些功能的“正确”方式是什么?

考虑到它们的正确性保证,我假设我只需要担心这里的性能

那么,考虑到线程可能会突然切换内核,因此这些指令可能需要返回到较慢的代码路径,我应该如何构造和编写代码,以使代码具有最佳性能呢

例如,我应该尝试显式设置线程CPU亲缘关系,还是这种做法不好?

如果有CPU在中间中断一个中断,事务将中止。< /强>在RIP被保存之前处理中止,因此中断- > CPU迁移不能在这个或另一个核心上恢复,并且运行<代码> xEnt/Case>而不在事务中。

因此,不存在正确性问题


如果操作系统的进程调度器试图以一种不适合您的工作负载的方式跳转线程,那么将线程固定到内核可以帮助提高缓存位置的性能

但这对TSX没有什么特别的帮助:中断后在同一个内核上恢复也没有什么好处,因为事务已经中止。该内核将拥有您需要的所有缓存线,可能在L1d中仍然是热的,希望仍然处于独占或修改状态


CPU迁移只能在中断使用户空间任务进入睡眠状态,并且另一个内核上的内核决定抓取该任务时发生

在内核代码中,显然不要在事务内部调用
schedule()
;这与正确性无关,因为事务中止(可能)或执行最终或很快返回到此任务,我们到达
xend
,并成功提交作为单个大型事务发生的所有内容(包括调度程序和可能的另一个任务所做的所有内容)


实际上我还没有考虑过这一点,但是我认为没有任何理由期望TSX的线程亲和性性能考虑与非TSX有显著不同。