相关疑难解决方法(0)

以编程方式查找计算机上的核心数

有没有办法以独立于平台的方式确定机器有多少来自C/C++的内核?如果不存在这样的事情,那么每个平台确定它(Windows/*nix/Mac)呢?

c c++

450
推荐指数
12
解决办法
19万
查看次数

如何在Mac OS X上发现*logical*核心的数量?

从命令行中,您如何判断运行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进一步完善,正是我所需要的.因人而异.

macos makefile

368
推荐指数
11
解决办法
19万
查看次数

使用C++设置进程核心配额

如果您编写软件,客户支付软件使用的CPU核心数量,那么在C++代码中实现这一目标的最佳方法是什么?到目前为止,我的研究使我SetProcessAffinityMask在Windows和sched_setaffinityPOSIX系统上使用.

c++ multicore core

13
推荐指数
1
解决办法
660
查看次数

C/C++/Assembly以编程方式检测Windows,Mac和Linux上的超线程是否处于活动状态

我已经可以在所有这三个平台上正确检测逻辑处理器的数量.

为了能够正确检测物理处理器/核心的数量,我必须检测是否支持超线程并且是否激活(或者如果您愿意,则启用),如果是,则将逻辑处理器的数量除以2以确定物理处理器的数量.

Perphaps我应该提供一个例子:

启用了超线程的四核Intel CPU具有4个物理内核,8个逻辑处理器(超线程创建4个逻辑处理器).所以我的当前函数将检测到8而不是所需的4.

因此,我的问题是,是否有办法检测是否支持超线程并启用?

c c++ assembly hyperthreading

6
推荐指数
1
解决办法
4676
查看次数

使用CPUID检测CPU规格,可靠的解决方案?

我正在尝试收集有关我的CPU的信息__cpuid().虽然它在我的计算机上运行正常,但当我在我的同事的计算机上运行我的程序时,它检测到英特尔酷睿2四核Q6600是超线程的,但根据英特尔自己网站上的规格,它不是.

__cpuid()还可以检测错误数量的"逻辑核心",如下所示:以 编程方式检测物理处理器/核心的数量,或者在Windows,Mac和Linux上是否激活超线程.声称英特尔至强E5520拥有16个逻辑核心和8个物理核心.

我尝试在我自己的计算机上运行该线程中的代码,Intel i7 2600K给我的数字与Xeon相同.

__cpuid()真的可靠吗?根据我自己的经验,它似乎并不那么可靠.我有一些非常根本的错误吗?

cpu cpuid

6
推荐指数
1
解决办法
1830
查看次数

OpenMP:请勿使用超线程核心(半个num_threads()具有超线程)

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()内核数。)

c++ openmp hyperthreading cpu-cores g++-4.7

5
推荐指数
1
解决办法
3700
查看次数

逻辑CPU计数返回16而不是4

我有一个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)

c c++ intel cpuid

2
推荐指数
1
解决办法
1097
查看次数

VS2012支持__asm__ __volatile__汇编代码

我正在使用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)

c++ assembly visual-studio-2012

1
推荐指数
1
解决办法
867
查看次数

如何使用 cpuid 找出 CPU 核心数?

我对物理核心感兴趣,而不是逻辑核心。

我知道https://crates.io/crates/num_cpus,但我想使用 cpuid 获取核心数量。我最感兴趣的是适用于 Ubuntu 的解决方案,但跨平台解决方案也是受欢迎的。

multicore cpuid rust

1
推荐指数
1
解决办法
945
查看次数