【问题标题】:How to optimize code for Simultaneous Multithreading?如何优化同时多线程的代码?
【发布时间】:2020-04-09 16:18:33
【问题描述】:

目前,我正在学习使用 CPU 进行并行处理,这是一个涵盖了很多教程和书籍的主题。

但是,我找不到一个关于超线程 CPU 编程技术的教程或资源。没有一个代码示例。

我知道要使用超线程,必须实现代码以便可以同时使用 CPU 的不同部分(最简单的例子是同时计算整数和浮点数),所以它不是即插即用-玩。

如果我想了解有关此主题的更多信息,我应该查看哪个书籍或资源?谢谢。

编辑:当我说超线程时,我指的是同时多线程,而不是英特尔的超线程。

编辑 2: 例如,如果我有一个 i7 8 核 CPU,当它使用全部 8 核而不是 1 时,我可以使运行速度提高 8 倍的排序算法。但它将在 4 核 CPU 和 4c-8t CPU 上运行相同,所以在我的情况下,SMT 什么都不做。

同时,Cinebench 在 4c-8t CPU 上比在 4c-4t CPU 上运行得更好。

【问题讨论】:

  • 您搜索的不是使用超线程的代码,这是SMT 的营销术语,而是多线程。关于这个话题有很多资源,但我个人不知道有什么好的建议,所以我不会对此做出回答。您可能应该编辑您的问题以要求使用多线程,以便获得有用的答案。
  • 不,您误解了:超线程 (SMT) 是 CPU 制造商使用的一种技术,允许每个 CPU 内核执行多个线程。多线程通常意味着同时运行多个线程,这就是您要搜索的内容。 SMT 不是你在编程时可以与之交互的东西,它只是增加了 CPU 可以同时执行的线程数。
  • 要添加到@eike 的评论中,您只能间接与 SMT 交互...您可以以允许 SMT 更好地执行的方式构建代码,但您不能告诉 CPU 如何在您的代码上“使用”SMT。这种情况与缓存稍有相似:您无法将数据显式加载到缓存中,但您可以重新构造代码以更好地填充缓存。
  • “我应该像不存在 SMT 一样编程吗?” 对于通常的 (TM) 多线程应用程序,是的。稍后优化时,您绝对应该考虑 SMT。抱歉,我现在无法给出详细的答案,自从我使用这种东西已经有一段时间了:-)
  • @user3192711 我的最后一条评论:几年前我参加过this very good three day course,它是关于节点级性能工程的。在第 2 天,他们讨论 SMT(重点关注 HPC 应用程序),也许它可以给你一个指点。

标签: c++ multithreading parallel-processing multiprocessing hyperthreading


【解决方案1】:

当一个线程从内存中加载某些东西时,SMT 通常是最有效的。根据内存(L1、L2、L3 缓存、RAM)的不同,读/写延迟可能会跨越很多 CPU 周期,如果每个内核只执行一个线程,这些周期将不得不浪费在无所事事上。

因此,如果您想最大限度地发挥 SMT 的影响,请尝试将两个线程的内存访问交错,以便其中一个执行指令,而另一个读取数据。从理论上讲,您也可以只使用一个线程来进行缓存预热,即将数据从 RAM 或主存储加载到缓存中,以供其他线程后续使用。

成功应用此功能的方式可能因系统而异,因为缓存、RAM 和主存储的访问延迟以及它们的大小可能会有很大差异。

【讨论】:

  • “其中一个可以执行指令,而另一个读取数据”这是我在答案中寻找的信息类型。你知道网上有什么书或资源可以更多地讨论这个吗?
  • @user3192711 遗憾的是没有公开的。我从大学讲座中了解了 SMT 的基本原理,并从中推断出其余部分。我确信有很多关于一般主题的资源,但我没有任何可推荐的。在进行性能优化时,cache locality 通常在不改变所使用算法的基本思想的情况下会产生比较大的影响。由于这也减少了等待数据所浪费的时间,并且更容易理解和调整,因此最好先寻找它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-23
相关资源
最近更新 更多