![]() |
1
2
正如已经指出的,如果您尝试让不同的线程处理不同的输入字符串,则会有更新争用,因为每个线程都可以增加每个字母的计数。您可以让每个线程生成自己的映射,然后“添加所有映射”,但最后一步可能会很昂贵(而且由于共享数据,不太适合使用线程)。我认为使用下面的算法,大型输入可能运行得更快,其中每个线程处理不同的字母进行计数(对于输入中的所有字符串)。因此,每个线程都有自己的独立计数器,因此没有更新争用,也没有最后一步来组合结果。然而,我们需要预处理来发现“唯一字母集”,这一步确实有相同的争用问题。(实际上,您可能知道前面的字符世界,例如字母,然后就可以创建26个线程来处理a-z,并绕过这个问题。)在任何情况下,可能的问题主要是探索“如何编写f异步代码来划分线程间的工作”,因此下面的代码演示了这一点。
我确实“完全改变了算法”,主要是因为我原来的算法不太适合由于更新争用而直接进行数据并行化。取决于你到底想学什么,这个答案可能会让你特别满意,也可能不会让你特别满意。 |
![]() |
2
3
你可以这样写:
并用两个额外的字符将其并行以使用
例如,从5.5MB King James Bible计算频率所用的时间从4.75s下降到0.66s,这是8核机器的7.2倍加速。 |
![]() |
3
1
Parallel与Async不同,因为 Don Syme explains . 所以我觉得你最好用plinq来并行化。 |
![]() |
4
0
我一点也不会说F,但我可以解决这个问题。考虑使用map/reduce: 让 n = 卡(七) 是字母表∑中的符号数σ。 地图阶段: 产卵 n 进程,其中 我 -这个过程是计算符号出现的次数。 西格玛 我 在整个输入向量中。 减少阶段 : 为每个 n 按顺序处理。这个向量就是你的结果。 现在,这个版本不会比一个串行版本有任何改进;我怀疑这里有一个隐藏的依赖性,这使得它本来就很难并行,但是我太累了,大脑已经死了,无法在今晚证明它。 |
|
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |
![]() |
user1700890 · 了解交互式代理Python API中的线程 2 年前 |
![]() |
AntonBoarf · 为什么要将实例变量指定给局部变量? 2 年前 |
![]() |
rhymes · 如何让线程操作相同的java列表 3 年前 |