1

我正在编写一个资源密集型应用程序,并且我试图找到一种方法让所述应用程序的用户决定应用程序应该使用哪些资源。

这里的部分问题是知道 CPU 的能力 -> 我想如果用户希望应用程序在 AMD Phenom II X6 上使用 5 个内核,我可以将所有东西都扔在这 5 个内核上。另一方面,如果处理器是 Intel i7 或 AMD FX-8510,则其中一些内核共享各种组件。那么我应该怎么做,以确保我不会意外地将某些东西安排到超线程调度程序,或者到那种程度?

我试图避免 CPU 阻塞的情况,因为我把所有东西都扔到了错误的部分(这是一个老问题)。有任何想法吗?

4

1 回答 1

1

操作系统中的线程调度程序具有所有必要的信息(物理 CPU 内核的数量、哪些逻辑内核共享资源、哪些内核停放在安全能量上、是否启用了超线程、哪些内核使用涡轮频率、其他程序使用了哪些资源等...) 用于高效的 CPU 资源分配。你的程序对这些事情一无所知,所以你能做的最好的事情就是让操作系统决定如何分配资源。即使您的程序没有任何特殊支持,用户也可以根据需要通过设置进程优先级或处理器亲和性来限制程序使用的资源。

您可以尝试的一件事是根据 CPU 内核数(由 Environment.ProcessorCount 返回)创建线程数。如果您认为每个物理核心调度一个线程(而不是每个逻辑核心一个线程)会执行得更好,您可以使用 Process.GetCurrentProcess().ProcessorAffinity 属性 - 在具有超线程的 CPU 上将其设置为 0x55555555,但这也可以使事情比以前更糟(如果未来的某个 CPU 将每个物理核心有 3 个逻辑核心而不是 2 个,或者如果另一个程序将处理器关联设置为相同的核心怎么办?)。

于 2012-05-19T06:20:29.377 回答