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()
}
(これは木枠crossbeam
とsimple_parallel
を使用していますが、私はこれらを使用していない解決策を受け入れます)
残念ながら、この実装はスレッドなしのバージョンよりも遅くなります私はcollect
とconcat
が問題ですが、私はどのようにトンを知っていないと信じて
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安全でないコードを使わずにそれらを避ける。
安全なコードを使用して(スレッドを使用して)このアルゴリズムのパフォーマンスを改善するにはどうすればよいですか? (安全でないコードのソリューションも面白いですが、安全でないコードがないソリューションが必要です)
1バイトあたり1スレッドですか?スピンアップしているスレッドのオーバーヘッドが、入力に基づいて減速を引き起こす原因であると私は想像することができます。 –
'Vec'ではなく、どこでも'&[u8] 'と'&[u64] 'を使うほうが簡単だろう。 –