English 中文(简体)
有没有任何方式在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.
 )

我想将这个改成双核变为多线程。据我所知这不可能,但很有可能你会有一些想法。

问题回答

如果数组大小相当大,您可以通过并行化获得一些好处,例如将数组分为两个部分并同时处理。您应该查看Parallel Framework来进行多线程处理。

我理解你的问题,你想知道如何并行化这段代码:

我认为使用更好的算法可以获得更快的速度:例如,对数组进行排序(您可以使用并行合并排序完成此操作),仅比较相邻条目。然后,您还可以通过使用单独的线程处理数组的每半部分轻松地并行比较它们。

如果你需要更多细节,请告诉我们...

一个并行算法可能看起来像这样:

  • Sort the list of terms alphabetically using a parallel sort algorithm
  • Divide the sorted list of terms into chunks, such that all interesting terms are in the same chunk. If I m not mistaken, so long as each chunk starts with the same character, you ll never have interesting matches across two chunks (matches and prefixes will always have the same first character, right?)
  • For each chunk, find terms that are prefixes and/or matches, and take appropriate action. This should be easy, since matching terms will be right next to each other (since the big list is sorted, each chunk will be too).

一些注记:

这需要一种并行排序算法。显然这样的算法已经存在,但是我对它们不太了解,因为我从来没有直接使用过它们。你的结果可能会有所不同。

第二步骤(将工作负载拆分成块)本身似乎不可并行化。您可以使用修改后的二分搜索来实现它,以找到第一个字符更改的位置,因此希望这部分很便宜,但可能不是,并且在测量之前您可能不会确定。

如果您最终得到许多块,并且其中一个显然是最大的,那么您的性能将会很糟糕。

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

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

I am not sure if Parallel Extensions to .net is your answer. You may check it out from Download page and Project s blog

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

如果中间的检查是一个长时间运行的过程,您可以将其作为单独的线程运行,然后在最后只需加入所有线程(由于您有很多线程,使用带有2个线程限制的线程池 -您不应该启动所有线程,运行,等待完成一个,然后启动一个新的等等-)。

最后,只需join()所有线程,就完成了。





相关问题
热门标签