【问题标题】:Multithread calculation over sorted combinations of alphabet in CC中字母排序组合的多线程计算
【发布时间】:2017-06-05 23:23:45
【问题描述】:

我想多线程一个“蛮力”算法。

我有一个函数bool check(const char *s, size_t n),它检查大小为n 的字符串s 是否是密码。

对于我的字母表可能的所有字符串组合(字母表中大约 90 个字符)调用此函数。

我可以在一个线程中完成,但现在我想多线程。 我还希望我的线程每个都有几乎相同的工作量我不希望一个线程必须测试 1B 组合而另一个只测试 1k)。

我想将负载分成“批次”组合。每个批次都有一个start 索引和一个stop 索引,因此拥有该批次的线程必须测试startstop 之间的所有组合。

我所说的组合索引是它的字典索引,例如字母表 [A, B, C]:

index combination
1        A 
2        B
3        C
4        AA
5        AB
6        AC
7        BA
8        BB
...      ...

例如,分配有start=4stop=7的批处理的线程将测试AA, AB, AC, BA的组合。

如何轻松地为线程中的批次生成组合?优先考虑的是它要快,因为程序的重点是暴力破解。

还有另一种快速的方法来在线程之间拆分工作吗?

【问题讨论】:

    标签: c performance combinations


    【解决方案1】:

    如果您已经将所有字符串都放在一个列表中,那么使用字典顺序就可以了,但是如果您想生成字符串,那么使用它就不容易了。所以,我会忘记它作为一个想法。

    相反,您可以做的是启动 90 个线程,给每个线程一个起始字母以使用,并让每个线程考虑由它给出的第一个字母以及其余字母的所有组合组成的单词。

    【讨论】:

    • 我可能建议将起始字符划分为与您拥有的逻辑核心数量相等的线程数,以避免任何上下文切换开销
    • @Nic 实际上,按照我对现代流水线 CPU 工作原理的理解,拥有比内核更多的线程可以带来显着的好处。不过这里我们不要争论这个,因为它是一个不同的主题,适合不同的问题和答案。
    • 看来这里有一个很好的答案:stackoverflow.com/a/24716319/4126177 :)
    猜你喜欢
    • 2020-09-18
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多