gpt4 book ai didi

c# - 为什么我的并行任务代码无法达到100%的CPU使用率?

转载 作者:行者123 更新时间:2023-12-03 13:23:29 24 4
gpt4 key购买 nike

private static async Task<int> SumParallel()
{
var intList = Enumerable.Range(1, 1000_000_000);
int count = intList.Count();
int total = 0;
for(int i = 1; i < 5; i++)
{
int skip = ((i - 1) * count) / 4;
int take = count / 4;
Interlocked.Add(ref total,
await GetSum(intList, skip, take));
}
return total;
}

private static async Task<int> GetSum(IEnumerable<int> list, int skip, int take)
{
return await Task.Run(() =>
{
int temp = 0;
foreach(int n in list.Skip(skip).Take(take))
{
if (n % 2 == 0)
temp -= n;
else
temp += n;
}
return temp;
});
}

我正在尝试执行计算密集型任务,只是为了练习任务并行库。所以,我写了这段代码。如果我尝试使用Parallel Linq计算相同的总和,则可以看到CPU利用率达到100%,如下所示:
int sum = Enumerable.Range(1, 1000_000_000)
.AsParallel()
.Select(i => i % 2 == 0 ? -i : i).Sum();

手动并行任务代码= 10秒时间,cpu =仅25%

并行Linq代码= 18秒的时间,cpu = 100%(仍然需要18秒)

没有并行的Linq代码:14秒,cpu =仅25%

为什么会这样呢?当我同时并行启动4个线程时,为什么我的cpu利用率没有达到100%?就像非并行代码(只有一个线程)中的代码一样,它只有25%。我是否真的并行运行4个线程?

我的笔记本电脑是Core i3-2核心= 4逻辑处理器

最佳答案

SumParallel没有做并行工作,因为它顺序创建并等待每个任务:

for(int i = 1; i < 5; i++) {
//...
await GetSum(intList, skip, take)

要使其平行,您必须启动所有五个任务,然后用 await将它们全部完成,以 await Task.WhenAll(tasks);完成。

至于Parallel Linq的速度比标准Linq慢,这是因为您的工作负载过于精细。结果,并行的开销抵消了并行执行的任何好处。换句话说,将项目分配到线程并收集返回的结果要比实际计算( n % 2)更多。为了充分利用并行性,您的工作量必须很庞大。

关于c# - 为什么我的并行任务代码无法达到100%的CPU使用率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62099331/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com