gpt4 book ai didi

concurrency - 为什么有并发的矩阵乘法比没有并发的慢?

转载 作者:行者123 更新时间:2023-11-29 08:10:38 26 4
gpt4 key购买 nike

我的程序的某些部分导入了一个包含两个矩阵的文件并将它们相乘。

但我很困惑为什么有并发的持续时间比没有并发的持续时间长?

我的代码中有错误吗?

// without concurrency
let mut result = vec![];

let time1 = Instant::now();
for i in 0..n {
let mut temp_vector = vec![];
for j in 0..n {
let mut temp_num = 0;
for multiple_count in 0..m {
temp_num = temp_num + arr1[i][multiple_count] * arr2[multiple_count][j];
}
temp_vector.push(temp_num);
}
result.push(temp_vector);
}
let time2 = Instant::now();
println!("normal solving result:\n");

for i in 0..n {
for j in 0..n {
print!("{:?} ", result[i][j]);
}
println!("");
}
let pass = time2.duration_since(time1);
println!("{:?}\n",pass);

println!("concurrency solving solution:\n");


// start the concurrency

let mut handles = vec![];

let arr1 = Arc::new(RwLock::new(arr1));
let arr2 = Arc::new(RwLock::new(arr2));

let count_time1 = Instant::now();
for i in 0..n {
for j in 0..n {
let arr1 = arr1.clone();
let arr2 = arr2.clone();
let handle = thread::spawn(move || {
let mut count = 0;
let arr1 = arr1.try_read().unwrap();
let arr2 = arr2.try_read().unwrap();
for k in 0..m {
count = count + arr1[i][k] * arr2[k][j];
}
count
});
handles.push(handle);
}
}
let count_time2 = Instant::now();
let pass_time = count_time2.duration_since(count_time1);

最佳答案

无需过多研究细节:您正在生成 n² 个线程——结果矩阵中的每个单元格一个。产生线程是昂贵的(请注意,Rust 不使用“绿色线程”,而是默认使用系统线程)。

并发并不仅仅是加速一切;人们必须对此有点聪明。通常你只想利用所有 CPU 核心,因此你应该只生成与核心数量大致相同的线程。在您的情况下,生成线程可能比线程执行的操作花费更多的时间,因此速度变慢。

关于concurrency - 为什么有并发的矩阵乘法比没有并发的慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37360667/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com