簡體   English   中英

如何在 Parallel.ForEach 中迭代多個跨度?

[英]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() 使其按預期工作:

  1. 我切換到人工索引數組而不是跨度作為 PFE 的基礎
  2. 我在 lambda 中為 Span 使用了 1 個分配(因為整個索引是/按分區程序中的核心數,它只分配了 4 個 span)
  3. 這是 MS 的小體循環並行化的實現(鏈接我的原始帖子)
  4. 可以通過將指針傳遞給 span 來進一步改進,從而避免此處提到的分配

我結束了這個:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM