我是统计模式识别的研究员,我经常运行运行很多天的模拟.我正在使用Linux 3.2.0-24-generic运行Ubuntu 12.04,据我所知,它支持多核和超线程.使用带有HTT的英特尔酷睿i7 Sandy Bridge Quadcore,我经常同时运行4次模拟(需要很长时间的程序).在我提出问题之前,我已经(我想)知道的事情.
好的,我的问题如下.当我在我的计算机上同时运行4个模拟(程序)时,它们每个都运行在一个单独的物理核心上.但是,由于超线程,每个物理核心被分成两个逻辑核心.因此,每个物理内核是否只使用其全部容量的一半来运行我的每个模拟?
非常感谢你提前.如果我的问题的任何部分不清楚,请告诉我.
我很好奇Linux中的CPU排序是什么.假设我将一个线程绑定到cpu0而另一个线程绑定到超线程系统上的cpu1,它们是否都将位于同一个物理核心上.鉴于具有4核和超线程的Core i7 920,/ proc/cpuinfo的输出让我认为cpu0和cpu1是不同的物理内核,而cpu0和cpu4在同一物理内核上.
谢谢.
我今天早上试图找出如何确定哪个处理器ID是超线程核心,但没有运气.
我希望找到这些信息并用于set_affinity()将进程绑定到超线程线程或非超线程线程以分析其性能.
两个进程可以同时在一个具有超线程的CPU核心上运行吗?我从互联网上学习.但是,我没有看到明确的直接答案.
编辑: 感谢您的讨论和分享!我的钱包在这里发布我的问题不是讨论并行计算.它太大了,不能在这里讨论.我只想知道多线程应用程序是否可以从超线程中获益,而不是多进程应用程序.在进一步阅读之后,我有以下作为我的学习笔记.
1)启用超线程技术CPU核心有两组CPU状态和中断逻辑.同时,它只有一组执行单元和缓存.(我还没有研究什么是管道)
2)只有在某些执行的线程中发生延迟时,多线程才能从超线程中获益.我认为这一点可以准确地映射为什么以及何时软件程序员使用多线程的常见原因.如果多线程应用程序已经过优化.它可能无法从Hypter线程中获得任何好处.
3)如果CPU状态映射到进程状态,我相信Marc是正确的,多进程应用程序甚至可以从超线程技术中获益更多.
4)当CPU供应商说"线程"时,看起来他们的"线程"与我认为是java程序员的线程不同?
我有Intel i7-2600K四核,在Ubuntu 12.04上启用了超线程.我知道我可以找到我在Python中有多少核心import multiprocessing; multiprocessing.cpu_count(),但这给了我8,因为我在4个物理核心上启用了超线程.我很想知道我有多少物理核心.有没有办法在Python中做到这一点?或者,有没有办法在Python中找出是否启用了超线程?预先感谢您的帮助!
我有几个问题悬而未决几天没有答案.问题出现了,因为我有一个OpenMP和一个同样问题的OpenCL实现.OpenCL在GPU上运行完美,但在CPU上运行时性能降低了50%(与OpenMP实现相比).一篇文章已经在讨论OpenMP和OpenCL表演之间的区别,但它没有回答我的问题.目前我面临以下问题:
1)拥有" 矢量化内核 "(就英特尔离线编译器而言)真的那么重要吗?
有一个类似的帖子,但我认为我的问题更为笼统.
据我了解:矢量化内核不一定意味着编译后的二进制文件中没有向量/ SIMD指令.我检查了我的内核的汇编代码,并且有一堆SIMD指令.向量化内核意味着通过使用SIMD指令,您可以在一个CPU线程中执行4(SSE)或8(AVX)OpenCL"逻辑"线程.只有当所有数据连续存储在内存中时,才能实现此目的.但谁拥有如此完美排序的数据?
所以我的问题是:在这个意义上让内核"矢量化"真的很重要吗?
当然,它可以提高性能,但如果内核中的大多数计算密集型部分都是通过向量指令完成的,那么您可能会接近"最佳"性能.我认为我的问题的答案在于内存带宽.可能矢量寄存器更适合高效的存储器访问.在这种情况下,内核参数(指针)必须进行矢量化.
2)如果我在CPU上的本地内存中分配数据,它将在哪里分配?OpenCL将L1缓存显示为本地内存,但它显然与GPU本地内存上的内存类型不同.如果它存储在RAM /全局存储器中,那么将数据复制到其中是没有意义的.如果它在缓存中,其他一些进程可能会将其刷新......所以这也没有意义.
3)"逻辑"OpenCL线程如何映射到真正的CPU软件/硬件(Intel HTT)线程?因为如果我有短的运行内核并且内核像TBB(线程构建块)或OpenMP那样分叉,那么fork开销将占主导地位.
4)什么是线程叉开销?是否为每个"逻辑"OpenCL线程分叉了新的CPU线程,或者是一次分叉的CPU线程,并重用于更"逻辑"的OpenCL线程?
我希望我不是唯一一个对这些小事感兴趣的人,你们中的一些人现在可能会遇到这些问题.先感谢您!
UPDATE
3)目前OpenCL开销比OpenMP更重要,因此高效的运行时执行需要大量内核.在Intel OpenCL中,工作组映射到TBB线程,因此1个虚拟CPU核心执行整个工作组(或线程块).工作组使用3个嵌套for循环实现,如果可能,最内层循环被矢量化.所以你可以想象它是这样的:
#pragam omp parallel for
for(wg=0; wg < get_num_groups(2)*get_num_groups(1)*get_num_groups(0); wg++) {
for(k=0; k<get_local_size(2); k++) {
for(j=0; j<get_local_size(1); j++) {
#pragma simd
for(i=0; i<get_local_size(0); i++) {
... work-load...
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果最内部的循环可以进行矢量化,则可以使用SIMD步骤:
for(i=0; i<get_local_size(0); i+=SIMD) {
Run Code Online (Sandbox Code Playgroud)
4)每个TBB线程在OpenCL执行期间分叉一次并重用它们.每个TBB线程都绑定到一个虚拟核心,即.在计算过程中没有线程迁移.
我也接受@ natchouf的回答.
我正在使用Ubuntu。如何检查超线程是否启用。如果它被禁用,我该如何启用它?
我正在尝试收集系统信息并在Intel Xeon E5420上注意到以下内容:
执行后CPUID(EAX=1),EDX [28]设置,表示支持超线程,尽管处理器在英特尔网站上列为不支持超线程(ark.intel.com)
有没有人对此有解释?
在我的机器上,Windows 7 - Enterprise 1 x Intel Xeon E5-1660 0 @ 3.30Ghz(激活超线程的6核/ CPU),Environment.ProcessorCount返回12,这是准确的.
在具有2 x Intel Xeon E5-2697 v3 @ 2.60GHz的Windows Server 2012上(启动了超线程的14核/ CPU(我认为因为任务管理器显示:2个插槽,28个核心,56个逻辑处理器)),Environment.ProcessorCount返回因为2x14x2 = 56,我们认为这是错误的.
为什么在Windows Server 2012 c#方法Environment.ProcessorCount没有返回正确数量的逻辑处理器?
作为附加信息,环境变量如下:NUMBER_OF_PROCESSORS = 28

更新2015-05-26:
在我的另一个问题中有更多关于此相关错误的详细信息/原因:无法在C#应用程序中为我的线程使用多个处理器组.主要是我认为C#只使用一个处理器组.有什么问题,在我们的服务器上,有2个处理器组,尽管只有56个逻辑处理器.但是这个惠普客户咨询解释了为什么我们的服务器BIOS配置导致错误的窗口.
我试图找出一个操作系统(Windows,Linux)如何在启用超线程的环境中为逻辑cpus分配数字.?
两个操作系统是否首先将数字串行分配给物理CPU,然后开始对逻辑cpu进行编号,或者是否遵循其他规则?例如,在具有超线程的2个物理cpu系统中,OS是否将编号0,2分配给第一个物理cpu,然后将1,3分配给第二个物理cpu ..?
任何参考将非常感谢.
提前致谢.
问候,-Jay.
编辑:回应Alan的问题:我需要知道这一点因为,在我的工作中,我需要将各种线程绑定到特定的CPU以避免上下文切换,并且我想确保某些任务(THreads)绑定到单独的物理cpu .谢谢