gpt4 book ai didi

c# - 并行操作批处理

转载 作者:太空狗 更新时间:2023-10-29 18:11:21 27 4
gpt4 key购买 nike

TPL(任务并行库)是否内置了对批处理操作的支持?

我最近在玩一个例程,使用查找表对字符数组进行字符替换,即音译:

for (int i = 0; i < chars.Length; i++)
{
char replaceChar;

if (lookup.TryGetValue(chars[i], out replaceChar))
{
chars[i] = replaceChar;
}
}

我可以看到这可以简单地并行化,所以我知道第一次尝试会执行得更糟,因为任务太细粒度了:

Parallel.For(0, chars.Length, i =>
{
char replaceChar;

if (lookup.TryGetValue(chars[i], out replaceChar))
{
chars[i] = replaceChar;
}
});

然后我重新设计了算法以使用批处理,以便可以将工作分块到不同的线程上,分批处理的粒度不太细。这按预期使用了线程,我得到了一些接近线性的加速。

我确信 TPL 中必须有对批处理的内置支持。语法是什么,我该如何使用它?

const int CharBatch = 100;
int charLen = chars.Length;

Parallel.For(0, ((charLen / CharBatch) + 1), i =>
{
int batchUpper = ((i + 1) * CharBatch);

for (int j = i * CharBatch; j < batchUpper && j < charLen; j++)
{
char replaceChar;

if (lookup.TryGetValue(chars[j], out replaceChar))
{
chars[j] = replaceChar;
}
}
});

更新

在使用@Oliver 的答案并将 Parallel.For 替换为 Parallel.ForEach and a Partitioner 之后代码如下:

const int CharBatch = 100;

Parallel.ForEach(Partitioner.Create(0, chars.Length, CharBatch), range =>
{
for (int i = range.Item1; i < range.Item2; i++)
{
char replaceChar;

if (lookup.TryGetValue(chars[i], out replaceChar))
{
chars[i] = replaceChar;
}
}
});

最佳答案

为了更好地解决问题,您应该获取 Patterns for Parallel Programming: Understanding and Applying Parallel Patterns with the .NET Framework 4 .这是一个很好的来源,解释了如何使用 TPL 的常见方法。

查看第 26 页(非常小的循环体)。在那里你会找到这个例子:

Parallel.ForEach(Partitioner.Create(from, to), range =>
{
for (int i = range.Item1; i < range.Item2; i++)
{
// ... process i
}
});

所以您要搜索的缺失部分是 System.Concurrent.Collections.Partitioner .

关于c# - 并行操作批处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4613156/

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