2

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

它本质上是我所指的程序是一个蛮力生成器,通过密码递增,例如从 0000 .. 特定字符集的 zzzz: 需要 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,在我的书中它看起来像是一个很好的解决方案,您认为如何将其拆分以受益于我的计算机的多个内核?即核心 1 计算 aaaa..ffff,核心 2 计算 ffff...zzzz,这是唯一有意义的方法吗?

4

2 回答 2

3

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

于 2011-04-30T09:54:05.550 回答
0

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

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

编辑:

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

于 2011-04-30T09:40:40.477 回答