【问题标题】:Any way to make this working dual core in C#?有什么方法可以在 C# 中使这个工作双核?
【发布时间】:2009-04-04 13:56:29
【问题描述】:

我有一段代码循环遍历数组并在其中查找相似且相同的字符串 - 标记它是否唯一。

loop X array for I 
 ( loop X array for Y
   (
     If X is prefix of Y do. else if x is same length as Y and it's prefix do something.
   )
Here is the code to finilize everything for I and corresponding (found/not found) matches in Y.
 )

我想让这个双核多线程。据我所知,这是不可能的,但您很可能会有一些想法。

【问题讨论】:

标签: c# loops multicore


【解决方案1】:

如果数组大小相当大,您可以从并行化中获得一些好处,也许将数组一分为二并并行处理每一半。您应该查看Parallel Framework 来执行多线程。

【讨论】:

  • 所以我可以毫无问题地并行内循环?
【解决方案2】:

我了解您想知道的问题,如何并行化此代码:

我认为你会通过使用更好的算法获得更多的加速:例如对数组进行排序(您可以并行使用合并排序)并仅比较相邻条目。然后,您还可以通过单独的线程处理数组的每一半,轻松地进行并行比较。

如果您需要更多详细信息,请告诉我们...

【讨论】:

    【解决方案3】:

    并行算法可能如下所示:

    • 使用并行排序算法按字母顺序对术语列表进行排序
    • 将排序后的术语列表分成块,这样所有感兴趣的术语都在同一个块中。如果我没记错的话,只要每个块都以相同的字符开头,你就永远不会在两个块之间有有趣的匹配(匹配和前缀总是有相同的第一个字符,对吧?)
    • 对于每个块,找到前缀和/或匹配项,并采取适当的措施。这应该很容易,因为匹配的术语将彼此相邻(因为大列表已排序,每个块也将排序)。

    一些注意事项:

    这需要并行排序算法。显然这些存在,但我对它们知之甚少,因为我从来没有直接使用过它们。您的里程可能会有所不同。

    第二步(将工作负载分成多个块)本身似乎不是可并行化的。您可以通过修改后的二进制搜索来实现它,以查找第一个字符发生变化的位置,因此希望这部分很便宜,但可能并不便宜,而且在您测量之前您可能无法确定。

    如果你最终得到很多块,其中一个是迄今为止最大的块,你的表现就会很糟糕。

    您是否考虑过让算法保持单线程,但更改它以便第一步对列表进行排序?

    目前问题中描述的算法是 O(n^2),因为它在列表中的每个元素循环一次。如果列表已排序,则可以在一次遍历列表中找到重复项(重复项将彼此相邻)- 包括排序,这是 O(n log n) 的总成本强>。对于大型数据集,这将快得多、快得多。希望它足够快,您可以避免使用多个线程,这将是很多工作。

    【讨论】:

      【解决方案4】:

      我不确定 .net 的并行扩展是否是您的答案。 您可以通过Download pageProject's blog 进行查看

      【讨论】:

        【解决方案5】:

        一般来说,这个想法是让一个线程处理一半数据,另一个线程处理另一半——即线程一执行奇数索引,线程二执行偶数。不幸的是,关于您的问题并没有足够的信息来给出任何合理的答案,因为我们不知道各种操作之间是否存在任何依赖关系。比如说,如果我确实找到了前缀匹配,这意味着我想修改数组中的下一个元素以删除其中的任何前缀。显然,这种依赖会破坏幼稚的并行实现。但是,如果您对数据的操作是独立的,那么通过简单地划分工作,这应该很容易并行化。

        【讨论】:

          【解决方案6】:

          如果中间检查是一个长时间运行的进程,您可以将其作为单独的线程运行,然后在最后加入所有线程(因为您有这么多线程使用线程池和 2 个线程限制 - 您不应该启动它们都运行,等待完成一个启动一个新的等等-)。

          最后,只要 join() 所有线程,就可以了。

          【讨论】:

            猜你喜欢
            • 2011-04-03
            • 2020-04-23
            • 1970-01-01
            • 1970-01-01
            • 2011-07-20
            • 1970-01-01
            • 2013-10-05
            • 2012-08-18
            • 1970-01-01
            相关资源
            最近更新 更多