2

この関数に並列処理を実装しようとしています。できるだけ多くのスレッドを取り、結果をファイルに書き込みたいです。

結果は増分順にファイルに書き込む必要があるため、最初の結果を最初に、2 番目の結果を 2 番目に、というように書き込む必要があります。

keyGen 関数は、各チェーンの開始点として使用される整数 m の MD5 です。Reduction32 はリダクション関数で、最初の 8 バイトに t を加算してその値を返します。チェーンがエンドポイントに到達すると、バイナリ ファイルに格納されます。

これを並列にするスマートな方法はありますか? エンドポイントが保存されている順序を台無しにすることなく?

void tableGenerator32(uint32_t * text){
    int mMax = 33554432, lMax = 236;
    int m, t, i;
    uint16_t * temp;
    uint16_t * key, ep[2];
    uint32_t tp;
    FILE * write_ptr;
    write_ptr = fopen("table32bits.bin", "wb");
    for(m = 0; m < mMax ; m++){
        key = keyGen(m);
        for (t = 0; t < lMax; t++){
            keyschedule(key);
            temp = kasumi_enc(text);
            tp = reduction32(t,temp);
            temp[0]=tp>>16;
            temp[1]=tp;
            for(i=0; i < 8; i++){
                key[i]=temp[i%2];
            }
        }
        for(i=0;i<2;i++)
            ep[i] = key[i];

        fwrite(ep,sizeof(ep),1,write_ptr);
    }
    fclose(write_ptr);
}
4

1 に答える 1

1

同時実行性の問題に直面せずに上記の関数を並列化する最良の方法は、使用したいスレッドと同じ数のメモリ ストリームを作成し、4 つのスレッドがある場合のように、タスクを分数に分割することです。

  • 1 つのスレッドが 0 から mMax / 4 までのタスクを実行します
  • 1 つのスレッドが mMax / 4 から (mMax / 4) * 2 までのタスクを実行します。
  • 1 つのスレッドが (mMax / 4) * 2 から (mMax / 4) * 3 までのタスクを実行します。
  • 1 つのスレッドが (mMax / 4) * 3 から (mMax / 4) * 4 までのタスクを実行します。

次に、結果ストリームを連結してファイルに書き込みます。

于 2015-06-16T13:54:02.197 に答える