2

编辑

我将说明我要解决的确切问题。简化的问题解释不起作用。

我正在编写一个框架,该框架需要我根据负载因子将线程分配给 CPU 内核。请让我们不要争论我为什么要这样做。

当框架启动时,它会形成以下硬件的映射:

  1. 级别 1:处理器工作组。
  2. 级别 2:NUMA 节点。
  3. 第 3 级:处理器(套接字)。
  4. 4级:核心。
  5. 5 级:逻辑处理器(仅适用于 SMT 系统)。

我用一个相当复杂的 5 级层次结构来表示这一点。

用户可以查询此硬件信息。用户可以指定任何内容,所需的工作组,所需的 NUMA 节点等,直到第 4 级。在这种情况下,框架只是过滤掉完整的数据集,只返回与输入匹配的内容,只要它符合层次结构(即用户没有说指定没有出现在指定处理器下的核心)。

接下来,用户指定范围,例如“给我任意 1 个工作组、任意 1 个 numa 节点和任意 3 个 CPU”。在这种情况下,框架应该返回分配最低的 3 个 CPU。这是一个过滤和排序过程。

同样,用户可以将他的过滤器指定为任何级别。

用户也可以简单地不指定任何内容,这意味着框架必须返回硬件信息,但根据每个级别的负载分配进行排序。

无论用户指定什么,该过程始终是过滤和排序。唯一的区别是用户可以指定范围、计数或什么都不指定。

要开始这个过程,我会根据用户提供的信息过滤原始硬件数据。这作为每个 L5 对象的对象 {L1, L2, L3, L4, L5) 的扁平化枚举返回。

接下来,我执行以下操作:

IEnumerable<KeyValuePair<int, double>> wgSub;
IEnumerable<KeyValuePair<int, double>> nnSub;
IEnumerable<KeyValuePair<int, double>> cpSub;
IEnumerable<KeyValuePair<int, double>> coSub;

wgSub = (
        from n in query
        group n by n.L1.ID into g
        select new KeyValuePair<int, double>(g.Key, g.Sum(n => n.L1.Assignment))
    )
    .OrderBy(o => o.Value);

nnSub = (
        from n in query
        group n by n.L2.ID into g
        select new KeyValuePair<int, double>(g.Key, g.Sum(n => n.L2.Assignment))
    )
    .OrderBy(o => o.Value);

cpSub = (
        from n in query
        group n by n.L3.ID into g
        select new KeyValuePair<int, double>(g.Key, g.Sum(n => n.L3.Assignment))
    )
    .OrderBy(o => o.Value);

coSub = (
        from n in query
        group n by n.L4.ID into g
        select new KeyValuePair<int, double>(g.Key, g.Sum(n => n.L4.Assignment))
    )
    .OrderBy(o => o.Value);

query = (
            from n in query
            join wgj in wgSub on n.L1.ID equals wgj.Key
            join nnj in nnSub on n.L2.ID equals nnj.Key
            join cpj in cpSub on n.L3.ID equals cpj.Key
            join coj in coSub on n.L4.ID equals coj.Key
            select n
        )
        .OrderBy(o => o.L1.ID == wgSub.Key)
        .ThenBy(o => o.L2.ID == nnSub.Key)
        .ThenBy(o => o.L3.ID == cpSub.Key)
        .ThenBy(o => o.L4.ID == coSub.Key);

我被卡住的地方是orderby(深度为4层)。我需要按每个子查询中的 ID 对输入查询进行排序,下一个是“thenby”等。我写的不正确。

如果用户指定了一个范围或一个计数(两者都暗示一个数量),我还需要实现一个 Take,可能针对每个级别。

4

1 回答 1

1

我不太清楚你要做什么,但会是这样吗?

query = query
   .OrderBy(n => wgSub.First(g => g.Key == n.L1.ID).Value)
   .ThenBy(n => nnSub.First(g => g.Key == n.L1.ID).Value)
   ...
于 2013-04-19T23:18:05.987 回答