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

これは、並列化できない順次操作です。

編集:

OK、今私は自分がどれほど間違っていたかがわかります:)実際にはこのプログラムを並列化できますが、出力の文字の順序を処理する追加のレイヤーを実装する必要があります。また、同期を実装する必要があります。

于 2011-04-30T09:40:40.477 に答える