【问题标题】:What would be an efficient way to add multithreading to this simple algorithm?将多线程添加到这个简单算法的有效方法是什么?
【发布时间】:2011-04-30 21:24:14
【问题描述】:

我想说我在 C 方面的知识是公平的,我希望扩展一个程序来增强我的并行编程知识。

我所指的程序本质上是一个蛮力生成器,通过密码递增,例如从特定字符集的 0000 .. zzzz 开始: Need help with brute force code for crypt(3)

算法概述如下(感谢 Jerome)

int len = 3;
char letters[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
int nbletters = sizeof(letters)-1;

int main() {
    int i, entry[len];
    for(i=0 ; i<len ; i++) entry[i] = 0;
    do {
        for(i=0 ; i<len ; i++) putchar(letters[entry[i]]);
        putchar('\n');
        for(i=0 ; i<len && ++entry[i] == nbletters; i++) entry[i] = 0;
    } while(i<len);
}

您认为这可以通过多线程以何种合乎逻辑的方式进行扩展?

CUDA 是一个愚蠢但简单的解决方案。我听说过 OpenMP,在我的书中它看起来像是一个很好的解决方案,您认为如何将其拆分以受益于我的计算机的多个内核? IE。核心 1 计算 aaaa..ffff,核心 2 计算 ffff...zzzz,这是唯一有意义的方法吗?

【问题讨论】:

  • entry 数组怎么样? 像{3, 21, 10} 这样更现实的东西不是全零。您也可以添加所需的输出。
  • @vbence,我不知道他在那里做了什么,从其他算法我看到数字表示字符集中的字母(然后你可以定义任意字符集),虽然我不确定,我将不得不修补它,找不到其他方法。

标签: c multithreading algorithm brute-force


【解决方案1】:

我想你回答了你自己的问题。线程#1 上的 aaaa..ffff 和线程#2 上的 ffff..zzzz 可能是要走的路,除了可能将其分解成更多线程部分,以防你有更多可用内核。尝试启动一个线程来执行 do 循环的某些部分可能会在如此紧凑的算法中引入比收益更多的开销。

【讨论】:

  • 我很感激,您对此有什么建议吗?有一个 pthreads-win32 实现,所以很可能只有那些可以工作。
  • 是的,我一直在使用 pthreads,它们看起来非常简单。然而,该算法似乎不喜欢在函数内部,我可能会找到一种对变化更稳定的算法。
【解决方案2】:

我假设您希望按照entry 数组中引用的顺序查看输出字符。

这是一个顺序操作,不能并行化。

编辑:

好的,现在我明白我的错误了 :) 实际上你可以并行化这个程序,但是你必须实现一个额外的层来处理输出中的字母顺序。还需要实现同步。

【讨论】:

  • 我认为这不是 OP 的意图。示例程序有点烦人,我认为在最终程序中,putchar() 将被替换为将密码传递给报告成功/失败且顺序无关紧要的解密例程。
  • 是的,字符串的顺序很重要,但是操作的顺序并不重要,并且与我的程序无关。
  • @Kenshin “字符串的顺序很重要”是什么意思?为什么要关心生成的订单字符串是什么?
  • @Kenshin 你能澄清一下你的意思吗?
  • @Nick,我相信我误读了答案,没有必要采取任何措施。我相信我在想,如果顺序不重要,那么我就无法分隔范围以提供给线程,这并不完全正确。
猜你喜欢
  • 1970-01-01
  • 2011-02-16
  • 1970-01-01
  • 1970-01-01
  • 2020-11-17
  • 2011-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多