阅读本文,特别是阅读Microsoft文档,它看起来应该返回PHYSICAL处理器的数量,并且您应该使用GetLogicalProcessorInformation来确定您拥有多少LOGICAL处理器.
这是我在SYSTEM_INFO结构上找到的文档:http://msdn.microsoft.com/en-us/library/ms724958 (v = VS.85).aspx这里是关于GetLogicalProcessorInformation的文档:(通过垃圾邮件添加的空格)过滤器) http:// msdn.microsoft.com/ zh-cn/library/ms683194.aspx
尽管如此,在我发现的关于这个主题的大多数讨论中,开发人员都说GetSystemInfo(以及SYSTEM_INFO结构)报告了LOGICAL处理器的数量.
当我再次搜索时,我发现MS确实在此发布了一些信息(以及一个热修复),这里(通过垃圾邮件过滤器添加了空格): http:// support.microsoft.com/ kb/936235
读取它,听起来像在Xp上,预服务包3,GetSystemInfo报告SYSTEM_INFO结构中的LOGICAL处理器的数量.它还告诉我,在Windows Vista和Windows 7上,GetSystemInfo应该报告PHYSICAL处理器的数量(与Windows XP pre-service Pack 3不同).
有谁知道它实际上做了什么?GetSystemInfo是否真的以不同的方式报告物理处理器的数量(在同一台计算机上),具体取决于它运行的操作系统?
据我所知,英特尔x86_64的超线程内核中没有共享MMU和TLB。
但是,如果两个不共享地址空间的线程被调度到同一物理核心,它们如何运行?
我认为,在那种情况下,线程没有任何机会达到TLB,因为线程具有自己的地址空间。
如果那样的话,我认为这种表现将被降级。
我正在尝试优化大型VC++项目的编译时间.我的处理器是Core i7 950(4核,8线程,因为它支持Intel超线程技术).
在Microsoft Visual Studio 2010中,如果转到"工具">"选项">"项目和解决方案">"VC++项目设置">"最大并发C++编译"
您可以选择用于并行C++编译的最大CPU内核.我在那里选择0(以便使用我的所有核心),这与使用4或8时产生完全相同的结果.
现在,如果我在编译项目时打开任务管理器,我可以看到4个并行编译线程正在运行(在进程下他们有描述:Microsoft C/C++编译器驱动程序),并且总CPU使用率略低于50%的所有时间.
所以我的问题是:
是否有可能在四核,超线程处理器中拥有8个并行编译线程?如果这是不可能的,那么在编译时是否有可能以某种方式使用接近100%的处理器功率?
这将为我节省大量时间.
非常感谢你提前,
尼古拉斯
c++ compiler-construction parallel-processing visual-studio-2010 hyperthreading
我使用python/numpy/cython编写的模拟.由于我需要平均多次模拟运行,因此我使用多处理模块批量运行所有单独的模拟运行.
在办公室我有一个带HT的i7-920工作站.在家里我没有i5-560.我想我可以在办公室的每一批中运行两倍的模拟实例,并将我的运行时间缩短一半.令人惊讶的是,与我在家庭工作站上的时间相比,每个实例的运行时间增加了一倍.它在家中并行运行3个模拟实例需要8分钟,而在办公室运行6个实例大约需要15分钟.使用'cat/proc/cpuinfo'我验证了'siblings'= 8和'cpu cores'= 4,因此启用了HT.
我不知道任何"总运行时间保护"法律(虽然从科学的角度来看它可能非常有趣:)),并且在这里跳跃的人可能会对这个难题有所了解.
我的电脑有一个四核i7处理器.我正在研究科学模拟的并行化.超线程如何影响并行性能?我知道我不应该使用超过4个工作流程来获得下降表现.但是我应该禁用超线程吗?它对并行性能有影响吗?
是否有一些示例代码可以说明英特尔的超线程性能?它是否可以从用户空间访问,或者 CPU 是否为程序员透明地完成所有工作?这是针对 C、Linux 的。
我有一个处理大量数据的应用程序.
当工作集超过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;
Run Code Online (Sandbox Code Playgroud)
两个线程都以锁步方式执行,工作线程以全速运行,而获取线程等待信号.
有没有办法强制两个线程在HyperThreaded CPU上的同一核心中运行?
我正在使用Delphi XE2.
PS我知道如何使用CPUID指令检测CPU是否支持超线程.
我正在阅读一些操作系统材料。我读到这句话让我有点困惑:“多核是指具有多个逻辑CPU核心的计算机或处理器,并且可以同时执行多个指令。”
什么是“逻辑CPU核心”,是处理器吗?它是否对应于物理的东西,或者是操作系统看到逻辑CPU核心,但实际上物理处理器比逻辑CPU核心少?
cpu operating-system multicore cpu-architecture hyperthreading
我有一些golang代码我在我的Macbook(具有两个物理内核的Intel Core i5处理器)上进行基准测试.
golang runtime.NumCPU()收益4,因为它算"虚拟核心"
在这种情况下,我对虚拟内核了解不多,但我的基准测试似乎表明,当我使用配置代码时,多处理速度只有2倍
runtime.GOMAXPROCS(runtime.NumCPU())
Run Code Online (Sandbox Code Playgroud)
如果我使用2而不是4核,我会得到相同的性能.我会发布代码,但我认为这与我的问题基本无关,它们是:
1)这是正常的吗?
2)为什么,如果是的话,多个虚拟核心能否像我的macbook这样的机器受益?
如果它很重要,在我的代码中,有与您设置runtime.GOMAXPROCS() 的任何内容相同数量的goroutine,任务完全并行,没有相互依赖性或共享状态.它作为本机编译二进制文件运行.
在Delphi中,我们需要知道用于并行化的CPU数量。到现在为止,我们已经在GetNativeSystemInfo()带有超线程的服务器上使用了运行良好的功能。
但是现在,我们有一台服务器(Intel Xeon Gold 6230)具有40个物理处理器和80个具有超线程的逻辑处理器,并且GetNativeSystemInfo()仅显示40个CPU。
我们制作了一个使用3个调用的小型测试程序:
GetNativeSystemInfo()
GetLogicalProcessorInformation()(“ 如何有效地检测逻辑和物理处理器数量的代码?”)
并查看注册表中的CPU数量:
计算机\ HKEY_LOCAL_MACHINE \硬件\ DESCRIPTION \系统\中央处理器
对于我们所有的服务器,这3个调用给出了相同数量的CPU:
但是对于英特尔至强,只有注册表为我们提供了80个CPU:
有谁知道为什么它不能在英特尔服务器上运行,还是知道一种确保获得最大CPU数量的方法?
hyperthreading ×10
c++ ×2
cpu ×2
delphi ×2
architecture ×1
c ×1
delphi-xe2 ×1
go ×1
linux ×1
mmu ×1
multicore ×1
optimization ×1
performance ×1
python ×1
tlb ×1
winapi ×1
windows ×1
x86 ×1