我Parallel.ForEach在我的代码中使用了一个.我的所有8个内核都达到了100%.这对于在服务器上运行的其他应用程序来说很糟糕.是否有可能将执行限制为4核心?
我试图使用命令提示符检索每个CPU的CPU数和内核数.我执行了以下命令:
wmic cpu get NumberOfCores, NumberOfLogicalProcessors/Format:List
我收到此错误: wmic' is not recognized as an internal or external command, operable program or batch file
我在Windows Server 2008 R2计算机上执行此操作.我相信'wmic'命令在这个窗口上是兼容的.
我运行命令promt的目录是'C:\ Windows>
有什么建议吗?
在我的机器上,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配置导致错误的窗口.
我尝试将我的程序CPU使用量除以核心.现在我使用PerformanceCounter并在0到1之间更改InstanceName我有来自2个核心的数据.
PerformanceCounter pc0 = new PerformanceCounter("Processor", "% Processor Time", "0");
PerformanceCounter pc1 = new PerformanceCounter("Processor", "% Processor Time", "1");
Run Code Online (Sandbox Code Playgroud)
如何获得第3,第4核等的核心使用?
有人能帮帮我吗?
谢谢
我有一个带有4个物理处理器插槽的系统.运行Windows 2003,我想以编程方式查找使用C++的套接字数量.这是可能的,如果是的话,怎么样?
好吧,所以我发布在In C#GetEnvironmentVariable("NUMBER_OF_PROCESSORS")中返回错误的数字,询问如何在C#中获取正确数量的内核.一些乐于助人的人向我提出了几个问题类似的问题,但我已经尝试过这些解决方案.然后我的问题被关闭,因为它与另一个问题是一样的,这是真的,但是,那里给出的解决方案没有用.所以我打开另一个希望有人能够帮助实现其他解决方案无法正常工作.
那个问题是如何通过.NET/C#找到CPU内核的数量?它使用WMI来尝试获取正确数量的内核.好吧,这是给出的代码的输出:
Number Of Cores: 32
Number Of Logical Processors: 32
Number Of Physical Processors: 4
Run Code Online (Sandbox Code Playgroud)
根据我的上一个问题,该机器是运行Windows Server 2008 R2 HPC版本的64核AMD Opteron 6276(4x16核心).
无论我做什么,Windows似乎总是返回32个核心,即使64个可用.我已经确认机器只使用32,如果我硬编码64个核心,那么机器会使用所有这些.我想知道AMD CPU的检测方式是否存在问题.
仅供参考,如果您还没有阅读上一个问题,如果我在命令行输入echo%NUMBER_OF_PROCESSORS,它将返回64.它只是不会在编程环境中执行.
谢谢,贾斯汀
更新:输出PROCESSOR_ARCHITECTURE从命令行返回AMD64,但从程序返回x86.该程序在64位硬件上运行32位.我被要求将其编译为64位,但它仍然显示32个核心.
我想检测实际物理核心的数量,而不是逻辑核心的数量,当更多线程竞争私有每核心缓存时负扩展的工作负载,和/或具有足够高的 IPC,每个核心运行一个以上的逻辑线程不会通过增加线程开销来增加吞吐量,特别是对于不能完美扩展到大量内核的问题。
或者换句话说,可以运行的线程数,除了内存带宽之外,它们中的任何一个都不会相互竞争执行资源。(编者注:超线程的一些替代方案,例如 AMD Bulldozer 系列 CMP有 2 个整数内核共享一个 FPU/SIMD 单元;您可能希望根据工作负载将其计为 2 个真实内核,即使您不想计算2 个逻辑内核与SMT(例如 Intel 的超线程)共享一个物理内核。)
我知道以前有人问过类似的问题,但答案看起来已经过时了。或者获取物理处理器数量 .NET Core 2.2没有答案,问题中的代码不是完全可移植的。
System.Environment.ProcessorCount仅返回逻辑核心数,因此是我的超线程系统中的两倍。对于一些密集的并行计算,启动线程数不超过可用物理内核数是最有效的- 至少我的测试表明,当我启动更多线程时,性能会显着下降。
我发现一些 Windows 解决方案调用 WMI 或 kernel.dll 来获取物理内核的数量。但是如何在 .net core 上保持平台独立性?是否有隐藏的核心数或可靠的计算方法?
到目前为止,我发现的最有前途的想法是在一个线程上做一些更长的计算并测量它的时间。然后并行执行相同的计算(ae ProcessorCount 线程)并测量总时间。比较两次以猜测物理内核的数量。这可能有效,但对我来说看起来成本高昂且不可靠。
我正在写一个小的winforms应用程序,打开另一个程序的几个实例.为了优化性能,我正在寻找一种方法来找到最少使用的CPU核心来分配流程.
我还希望能够看到每个核心的使用百分比.没什么好看的,TextBox或Label都没关系.
PerformanceCounter在遇到这些答案之后,我一直在尝试使用:
我尝试实现如下:
StatusBarOutput.Text = "";
//ignoring posible hyper-threading for simplicity's sake
var coreUsages = new PerformanceCounter[Environment.ProcessorCount];
for (var i = 0; i < coreUsages.Length; i++)
{
coreUsages[i] = new PerformanceCounter("Processor", "% Processor Time", i.ToString());
//using the status bar as output for now, doesn't really matter
StatusBarOutput.Text += " | " + coreUsages[i].CounterName + " ~ " + coreUsages[i].NextValue();
}
Run Code Online (Sandbox Code Playgroud)
我得到的输出是:

同时,任务经理正在显示:

不知道我在这里缺少什么.
我正在开发一个应用程序,它可以扫描数千个结构的副本; ~1 GB RAM.速度很重要.
ParallelScan(_from, _to); //In a new thread
Run Code Online (Sandbox Code Playgroud)
我手动调整线程数:
if (myStructs.Count == 0) { threads = 0; }
else if (myStructs.Count < 1 * Number.Thousand) { threads = 1; }
else if (myStructs.Count < 3 * Number.Thousand) { threads = 2; }
else if (myStructs.Count < 5 * Number.Thousand) { threads = 4; }
else if (myStructs.Count < 10 * Number.Thousand) { threads = 8; }
else if (myStructs.Count < 20 * Number.Thousand) { threads = 12; } …Run Code Online (Sandbox Code Playgroud) 希望这是一个比我以前更好的问题.我有一个.exe,我将传递不同的参数(文件路径),然后它将接收和解析.所以我将循环,循环遍历列表中的文件路径并将它们传递给此.exe文件.
为了提高效率,我希望将执行分散到多个核心,我认为您通过线程进行了这一操作.
我的问题是,我应该使用线程池,还是多个线程来异步运行这个.exe?
另外,根据你们认为哪一个是最好的,如果你能指出一个教程,它将有一些关于我想做什么的信息.谢谢!
编辑:我需要将.exe的执行次数限制为一次执行PER CORE.这是最有效的,因为如果我解析100,000个文件,我不能只启动100000个进程.所以我使用线程将一次执行的次数限制为每个核心执行一次.如果有其他方法(线程除外)找出处理器是否没有执行,或者.exe已经完成请解释.但是如果没有其他方法,我的最终问题是如何使用线程调用解析方法然后在该线程不再使用时回调?
第二次更新(非常重要):
我经历了每个人都告诉我的事情,并找到了我遗漏的一个关键因素,我认为这无关紧要.所以我使用的是GUI,我不希望它被锁定.这就是我想使用线程的原因.我现在的主要问题是,如何从线程发回信息,以便我知道执行何时结束?
我有一个调用多个线程的进程(例如6个线程).如果我在具有6 CPU或4 CPU的服务器机器上运行它会对其性能产生什么影响
每个CPU内部的线程CPU和内核之间的关系是什么.
我已经读过,线程只在一个CPU内的不同内核中运行.这是真的吗?