c - 效率核心是否支持与性能核心相同的指令?

标签 c multithreading assembly x86

在编写需要高计算性能的程序时,常常需要多线程、SIMD矢量化或其他扩展。可以通过CPUID查询CPU来了解它支持什么指令集。但是,由于程序员无法控制哪些核心实际执行不同的线程,因此如果不同的核心支持不同的指令集,则可能会出现问题。

如果在程序开始时查询 CPU,是否可以安全地假设所有线程都支持相同的指令集?如果不是,那么这是否会破坏假设它们都支持相同指令的程序,或者 CPU 是否足够聪明,意识到它们不应该使用这些内核?

是否需要分别查询每个线程的CPUID?

有什么方法可以避免程序在 E 核上运行吗?

如果指令集都一样,那“效率”在哪里?是缓存较少、时钟速度较低还是其他原因?

这个问题是出于好奇而提出的,但答案可能会影响我将来如何编写程序。如果您对这些问题有任何明智的评论,我将不胜感激,但如果您不太有信心,请不要只是分享您对它如何运作的想法和意见。谢谢。

我只是尝试在互联网上查找信息,但没有找到足够低水平的内容来充分回答这些问题。

最佳答案

Do efficiency cores support the same instructions as performance cores?

是(适用于英特尔的 Alder Lake,也适用于 big.LITTLE ARM)。

前往阿尔德湖;操作系统被“认为无法”处理异构CPU;因此,英特尔削弱了对性能核心(主要是 AVX-512)中已存在的扩展的现有支持,以匹配效率核心中存在的功能。

遗憾的是,在某些情况下(例如,虚拟机管理程序不会将所有 CPU 提供给单个 guest ),支持异构 CPU 实际上并不困难,并且在一般情况下是可以解决的;未能提供重新启用禁用扩展的方法(如果操作系统支持异构 CPU)会阻止操作系统将来尝试支持异构 CPU;本质上是将临时解决方案变成永久性问题。

Does one need to query CPUID on each thread separately?

不用于确定功能可用性。如果您有高度优化的代码(例如针对不同 CPU 类型进行不同调整的代码),您可能仍然需要(即使这不是严格需要);但还需要将线程固定到特定的 CPU 或 CPU 组。

Is there any way a program can avoid running on E-cores?

有可能,通过。 CPU亲和性。通常情况下,它只会让事情变得更糟(在 E 核心上运行比根本不运行更好,因为 P 核心已经很忙)。

If the instruction sets are the same, then where is the 'Efficiency'? Is it with less cache, lower clock speed, or something else?

较低的时钟,较短的管道,较不激进的推测执行,...

关于c - 效率核心是否支持与性能核心相同的指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74475598/

相关文章:

c - PE格式-IAT问题

c - 使用 Pipe()、fork() 和信号处理来管理程序中的内存和管道/套接字

java - Java 中使用 System.out.println 的多线程

c - sigwait() 和信号处理程序

assembly - radare2 中的 ASM 模式搜索

assembly - 学习低级计算机的好书

c - 如何删除双链表中所有出现的特定字符?

c - strncpy 段错误,但可以手动分配字符串

python - vtkRenderWindowInteractor 停止程序

visual-c++ - 如何将汇编标记放入 C++ 代码 (x64)