2016-04-01 10 views
0

DES暗号化アルゴリズムを並列化してパフォーマンスを向上させるのに問題があります。ここでスレッド化されていないスレッドがスレッド化されていないものより遅い

は私の試みです:

fn des(message: &[u8], subkeys: Vec<u64>) -> Vec<u8> { 
    let mut pool = Pool::new(THREAD_COUNT); 
    let message = message_to_u64s(message); 

    crossbeam::scope(|scope| { 
     pool.map(scope, message.iter().enumerate(), |(i, &block)| { 
      let permuted = ip(block); 
      let mut li = permuted & 0xFFFFFFFF00000000; 
      let mut ri = permuted << 32; 

      for subkey in &subkeys { 
       let last_li = li; 
       li = ri; 
       ri = last_li^feistel(ri, *subkey); 
      } 

      let r16l16 = ri | (li >> 32); 
      to_u8_vec(fp(r16l16)) 
     }).collect::<Vec<_>>() 
    }).concat() 
} 

(これは木枠crossbeamsimple_parallelを使用していますが、私はこれらを使用していない解決策を受け入れます)

残念ながら、この実装はスレッドなしのバージョンよりも遅くなります私はcollectconcatが問題ですが、私はどのようにトンを知っていないと信じて

fn des(message: &[u8], subkeys: Vec<u64>) -> Vec<u8> { 
    let message = message_to_u64s(message); 

    let mut cipher = vec![]; 

    for block in message { 
     let permuted = ip(block); 
     let mut li = permuted & 0xFFFFFFFF00000000; 
     let mut ri = permuted << 32; 

     for subkey in &subkeys { 
      let last_li = li; 
      li = ri; 
      ri = last_li^feistel(ri, *subkey); 
     } 

     let r16l16 = ri | (li >> 32); 
     let mut bytes = to_u8_vec(fp(r16l16)); 
     cipher.append(&mut bytes); 
    } 

    cipher 
} 

o安全でないコードを使わずにそれらを避ける。

安全なコードを使用して(スレッドを使用して)このアルゴリズムのパフォーマンスを改善するにはどうすればよいですか? (安全でないコードのソリューションも面白いですが、安全でないコードがないソリューションが必要です)

+0

1バイトあたり1スレッドですか?スピンアップしているスレッドのオーバーヘッドが、入力に基づいて減速を引き起こす原因であると私は想像することができます。 –

+0

'Vec'ではなく、どこでも'&[u8] 'と'&[u64] 'を使うほうが簡単だろう。 –

答えて

4

プロファイラーを使用してください。あなたは減速がどこであるかを推測することができますが、とにかく正しい場所を見つけることができないかもしれません。

しかし、教育的な推測のために、メッセージをTHREAD_COUNT部分に分割し、それらの部分を代わりにスレッドプールに送ることを試みます。別に8バイトのフラグメントを送信する場合は、DES自体よりも管理に時間がかかります。

+0

あなたの答えをありがとう。あなたは正しかった:私はメッセージを分割しなければならなかった。私はアプリケーションをプロファイリングするために 'valgrind'を試しましたが、スレッドの終了時にほとんどの時間が費やされているだけです。このようなプロファイリングの結果からあなたのソリューションを推測するにはどうすればいいですか? – antoyo

+0

興味深い...私はねじ切りされた錆のプロファイリングをまだ試みていません。あなたが閉鎖された唯一のものを集めたものであれば、これは良い質問であるかもしれません。理想的には、1行に1つのプロファイルが便利です。 – viraptor

+0

viraptor:私はデバッグシンボルでコンパイルしていませんでした。それらについては、より多くの関数呼び出しがありますが、この問題を推測する方法はまだわかりません。 2つの 'valgrind'の出力の間に目に見える差異の1つは、私の初期バージョンではクロージャーが多くの時間と呼ばれているということです。これは、あまりにも多くのスレッドが使用されたことを伝える方法だと思います。ありがとう。 – antoyo

関連する問題