在 .NET 中使用任务并行库针对特定 CPU 个核心?
Target specific CPU Cores with Task Parallel Library in .NET?
我正在做一个项目,我们需要为某些功能实现多任务处理。
为此,我们使用了 .NET 中最出色的工具之一 API - 任务并行库 (TPL)。
例如。 TPL 代码(取自 here)
static void Main()
{
var options = new ParallelOptions()
{
MaxDegreeOfParallelism = 2
};
List<int> integerList = Enumerable.Range(0,10).ToList();
Parallel.ForEach(integerList, options, i =>
{
Console.WriteLine(@"value of i = {0}, thread = {1}",
i, Thread.CurrentThread.ManagedThreadId);
});
Console.WriteLine("Press any key to exist");
Console.ReadLine();
}
众所周知,我们可以使用 'MaxDegreeOfParallelism' 选项来设置要使用的最大线程数。
假设我们有 16 个虚拟核心 VM,我想 运行 应用程序应该只针对几个选定的核心,比如 C1、C2、c8、c9。
请指导我如何使用 TPL 完成它?
谢谢,
维杰
这种运行时的微优化超出了 C# 的范围。而且它应该 绝对 不应该被硬编码到程序本身。通常,.NET 和 OS 的负载平衡功能将有效地处理 运行 个线程。
对于这种差异,可能会出现速度咆哮:https://ericlippert.com/2012/12/17/performance-rant/
然而,您可以在 OS 中设置此类限制,甚至无需查看应用程序代码:https://www.techjunkie.com/restrict-apps-cpu-cores-processor-affinity/
这听起来更像是您 need/should 使用的。
我不认为你可以在 TPL 抽象级别上做到这一点,但这个 answer 可能对你有用。
我正在做一个项目,我们需要为某些功能实现多任务处理。 为此,我们使用了 .NET 中最出色的工具之一 API - 任务并行库 (TPL)。
例如。 TPL 代码(取自 here)
static void Main()
{
var options = new ParallelOptions()
{
MaxDegreeOfParallelism = 2
};
List<int> integerList = Enumerable.Range(0,10).ToList();
Parallel.ForEach(integerList, options, i =>
{
Console.WriteLine(@"value of i = {0}, thread = {1}",
i, Thread.CurrentThread.ManagedThreadId);
});
Console.WriteLine("Press any key to exist");
Console.ReadLine();
}
众所周知,我们可以使用 'MaxDegreeOfParallelism' 选项来设置要使用的最大线程数。
假设我们有 16 个虚拟核心 VM,我想 运行 应用程序应该只针对几个选定的核心,比如 C1、C2、c8、c9。
请指导我如何使用 TPL 完成它?
谢谢, 维杰
这种运行时的微优化超出了 C# 的范围。而且它应该 绝对 不应该被硬编码到程序本身。通常,.NET 和 OS 的负载平衡功能将有效地处理 运行 个线程。
对于这种差异,可能会出现速度咆哮:https://ericlippert.com/2012/12/17/performance-rant/
然而,您可以在 OS 中设置此类限制,甚至无需查看应用程序代码:https://www.techjunkie.com/restrict-apps-cpu-cores-processor-affinity/ 这听起来更像是您 need/should 使用的。
我不认为你可以在 TPL 抽象级别上做到这一点,但这个 answer 可能对你有用。