有没有办法以独立于平台的方式确定机器有多少来自C/C++的内核?如果不存在这样的事情,那么每个平台确定它(Windows/*nix/Mac)呢?
从命令行中,您如何判断运行Mac OS X时机器上有多少个核心?在Linux上,我使用:
x=$(awk '/^processor/ {++n} END {print n+1}' /proc/cpuinfo)
Run Code Online (Sandbox Code Playgroud)
它并不完美,但它很接近.这是为了获取make,这就是为什么它给出比实际数字高1的结果.我知道上面的代码可以用Perl编写,也可以用grep,wc和cut编写,但我认为上面的内容在简洁性和可读性之间是一个很好的权衡.
非常晚编辑:只是为了澄清:我问有多少逻辑核可用,因为这与我想要make产生多少个同时工作相对应.jkp的答案,由Chris Lloyd进一步完善,正是我所需要的.因人而异.
如果您编写软件,客户支付软件使用的CPU核心数量,那么在C++代码中实现这一目标的最佳方法是什么?到目前为止,我的研究使我SetProcessAffinityMask在Windows和sched_setaffinityPOSIX系统上使用.
我已经可以在所有这三个平台上正确检测逻辑处理器的数量.
为了能够正确检测物理处理器/核心的数量,我必须检测是否支持超线程并且是否激活(或者如果您愿意,则启用),如果是,则将逻辑处理器的数量除以2以确定物理处理器的数量.
Perphaps我应该提供一个例子:
启用了超线程的四核Intel CPU具有4个物理内核,8个逻辑处理器(超线程创建4个逻辑处理器).所以我的当前函数将检测到8而不是所需的4.
因此,我的问题是,是否有办法检测是否支持超线程并启用?
我正在尝试收集有关我的CPU的信息__cpuid().虽然它在我的计算机上运行正常,但当我在我的同事的计算机上运行我的程序时,它检测到英特尔酷睿2四核Q6600是超线程的,但根据英特尔自己网站上的规格,它不是.
__cpuid()还可以检测错误数量的"逻辑核心",如下所示:以
编程方式检测物理处理器/核心的数量,或者在Windows,Mac和Linux上是否激活超线程.声称英特尔至强E5520拥有16个逻辑核心和8个物理核心.
我尝试在我自己的计算机上运行该线程中的代码,Intel i7 2600K给我的数字与Xeon相同.
那__cpuid()真的可靠吗?根据我自己的经验,它似乎并不那么可靠.我有一些非常根本的错误吗?
在g ++ 4.7中的OpenMP(并行使用)效率不是很高吗?在使用5倍CPU的情况下为2.5倍,我确定程序的性能在使用默认值的情况下在500%CPU左右的11s和13s之间变化(通常总是高于12s,有时甚至慢于13.4s)#pragma omp parallel for,并且OpenMP加速仅为在g++-4.7 -O3 -fopenmp4核8线程Xeon上,在5倍CPU w /时为2.5倍。
我尝试使用schedule(static) num_threads(4),并注意到我的程序始终在大约320%的CPU上以11.5s至11.7s(总是低于12s)完成操作,例如,运行更一致,并且使用了更少的资源(即使最好的运行速度比运行速度慢了半秒)具有超线程的罕见异常值)。
是否有任何简单的OpenMP方式可检测超线程并减少num_threads()到CPU内核的实际数量?
(有一个类似的问题,由于使用OpenMP的超线程导致的性能不佳:如何将线程绑定到内核,但是在我的测试中,我发现仅将线程从8个减少到4个就已经可以用g ++-4.7做到这一点。在Debian 7 Wheezy和Xeon E3-1240v3上,因此,这个问题仅仅是关于减少num_threads()内核数。)
我有一个Intel Core i5-2450m(2个物理处理器和4个逻辑处理器),我想找到一种方法来计算AMD和Intel CPU上的逻辑和物理内核.但是,经过一些搜索,我注意到了一些奇怪 我的代码给了我16而不是返回4个逻辑单元.
static int8_t LogicalProcCount(void)
{
if ( !Hyperthreading )
return 1;
uint32_t unused, ebx;
CPUID(1, unused, ebx, unused, unused);
return (int8_t) ( (ebx >> 16 ) & 0xFF );
}
Run Code Online (Sandbox Code Playgroud) 我正在使用VS2012 C++ Windows 7,我需要获取有关CPU多线程的信息,以计算可用逻辑处理器的数量.
我正在使用此代码(来自This SO Post)
typedef __int32 int32_t;
typedef unsigned __int32 uint32_t;
uint32_t registers[4];
__asm__ __volatile__ ("cpuid " :
"=a" (registers[0]),
"=b" (registers[1]),
"=c" (registers[2]),
"=d" (registers[3])
: "a" (1), "c" (0));
unsigned CPUFeatureSet = registers[3];
bool hyperthreading = CPUFeatureSet & (1 << 28);
Run Code Online (Sandbox Code Playgroud)
鉴于以下错误,此程序集无法编译:
error C2065: '__asm__' : undeclared identifier
Run Code Online (Sandbox Code Playgroud)
我尝试过更改__asm __volatile并将所有内容放在一行中:
__asm __volatile ("cpuid " : "=a" (registers[0]), "=b" (registers[1]), "=c" (registers[2]), "=d" (registers[3]) : "a" (1), "c" (0));
Run Code Online (Sandbox Code Playgroud)
这也不起作用,导致:
error C2400: …Run Code Online (Sandbox Code Playgroud) 我对物理核心感兴趣,而不是逻辑核心。
我知道https://crates.io/crates/num_cpus,但我想使用 cpuid 获取核心数量。我最感兴趣的是适用于 Ubuntu 的解决方案,但跨平台解决方案也是受欢迎的。