c++ - 如何优化同时多线程的代码?

标签 c++ multithreading parallel-processing multiprocessing hyperthreading

目前,我正在使用 CPU 学习并行处理,这是一个涵盖面广的主题,有大量教程和书籍。

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

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

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

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

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

同时,与 4c-4t CPU 相比,Cinebench 在 4c-8t CPU 上的运行要好得多。

最佳答案

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

所以,如果你想最大化SMT的影响,尽量让两个线程的内存访问交错进行,这样一个线程执行指令,另一个线程读取数据。理论上,您也可以使用一个线程仅用于缓存预热,即将数据从 RAM 或主存储器加载到缓存中以供其他线程后续使用。

成功应用此方法的方式因系统而异,因为缓存、RAM 和主存储器的访问延迟及其大小可能相差很大。

关于c++ - 如何优化同时多线程的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59369550/

相关文章:

parallel-processing - 防止在 Julia 并行化中覆盖模块

R拆分成组以并行执行

c++ - If 语句返回错误的输出 C++

java - 为什么我的服务器停止响应并且有办法监控它吗?

c++ - Lambda 作为函数参数

c - 在 C 中实例化结构列表

c++ - 如何使用 CSingleLock 提供对此缓冲区的访问权限?

LINQ 中的 C# 并行性

android - 在 Android 上上传纹理时避免停顿

c++ ->> 运算符重载函数无限递归