有什么方法可以在C#中实现这个双核工作?

时间:2009-04-04 13:56:29

标签: c# loops multicore

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

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.
 )

我想将它用于双核到多线程。据我所知,这是不可能的,但你很可能有一些想法。

6 个答案:

答案 0 :(得分:1)

如果数组大小相当大,您可以获得并行化的一些好处,可能将数组拆分为两个并并行处理每一半。您应该查看Parallel Framework以进行多线程处理。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

并行算法可能如下所示:

  • 使用并行排序算法按字母顺序对术语列表进行排序
  • 将排序的术语列表分成块,这样所有有趣的术语都在同一块中。如果我没有弄错,只要每个块都以相同的字符开头,你就不会在两个块之间进行有趣的匹配(匹配和前缀将始终具有相同的第一个字符,对吗?)
  • 对于每个块,查找作为前缀和/或匹配的术语,并采取适当的操作。这应该很简单,因为匹配的术语将彼此相邻(因为大的列表是排序的,每个块也是如此)。

一些注意事项:

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

第二步(将工作负载拆分为块)似乎本身不可并行化。您可以使用修改后的二进制搜索来实现它,以找到第一个字符发生变化的位置,所以希望这部分很便宜,但可能不会,并且在测量之前您可能不会确切知道。

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

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

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

答案 3 :(得分:0)

我不确定.net的Parallel Extensions是否是您的答案。 您可以从Download pageProject's blog

查看

答案 4 :(得分:0)

一般来说,想法是让一个线程处理一半数据而另一个线程处理另一半 - 即,线程1执行奇数索引,线程2执行偶数。不幸的是,由于我们不知道各种动作之间是否存在任何依赖关系,因此没有足够的关于您的问题的信息来提供任何合理的答案。比如说,如果我找到一个前缀匹配,这意味着我想修改数组中的下一个元素以删除其中的任何前缀。显然,这种依赖性将打破天真的并行实现。但是,如果您对数据的操作是独立的,那么通过简单地划分工作就可以相当容易地进行并行化。

答案 5 :(得分:0)

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

最后,只需加入()所有线程,就是这样。