![](/img/trans.png)
[英]Parallel.ForEach over AuthorizationRuleCollection
[英]How to iterate over multiple span-s in Parallel.ForEach?
輸入代碼:
我現在的代碼:
for (int i4 = 0; i4 < ba_result_out.Length; i4 += c.i_key_size)
{
k = BitConverter.ToInt64(spn_data.Slice(i4, c.i_key_size));
if (Dictionary.md1.ContainsKey(k)) {
//some logics skipped
}
}
我正在嘗試制作的代碼:(基於: https://learn.microsoft.com/en-us/do.net/standard/parallel-programming/how-to-speed-up-small-loop-bodies )
ParallelOptions po = new ParallelOptions { MaxDegreeOfParallelism = 2 };
var rp = Partitioner.Create(0, ba_result_out.Length / c.i_key_size, po.MaxDegreeOfParallelism);
Parallel.ForEach(rp, po, (range, loopState) =>
{
for (int i4 = range.Item1; i4 < range.Item2; i++)
{
k = BitConverter.ToInt64(spn_data.Slice(i4, c.i_key_size));
if(Dictionary.ContainsKey(k)){
//some logics skipped
}
});
任務:使其成為 Parallel.ForEach,跨度不可能。
問題:編譯器不允許 lambda 中的跨度
是否可以通過多個跨度為每個並行循環?
注意這是非常熱門的代碼——數十億次迭代——所以分配不是一種選擇——需要堅持跨度。
感謝那些參與的人!
我在 lambda function 中使用 AsSpan() 使其按預期工作:
我結束了這個:
i_max_search_threads = 4;
int[] ia_base_idxs = Enumerable.Range(0, ba_result_out.Length).ToArray();
var rp = Partitioner.Create(0, ia_base_idxs.Length, ia_base_idxs.Length / i_max_search_threads);
Parallel.ForEach(rp, po, (range, loopState) =>
{
Span<byte> spn_data = ba_result_out.AsSpan();
for (int i4 = range.Item1; i4 < range.Item2; i4 += c.i_key_size)
{
k = BitConverter.ToInt64(spn_data.Slice(i4, c.i_key_size));
if(Dictionary.ContainsKey(k)){
//some logics skipped...
}
}
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.