gpt4 book ai didi

multithreading - Rust中大量线程的性能下降

转载 作者:行者123 更新时间:2023-12-03 11:33:20 30 4
gpt4 key购买 nike

我正在Rust中创建一个无闩锁的并发HashMap。吞吐量曲线看起来就像我期望的那样,大约有16个线程,此时性能将下降。

吞吐率(MOps/秒)与Num线程数

我使用了具有48个vCPU和200GB RAM的Google Cloud实例。我尝试启用/禁用超线程,但是没有明显的结果。

这是我产生线程的方法:

for i in 0..num_threads {
//clone the shared data structure
let ht = Arc::clone(&ht);

let handle = thread::spawn(move || {
for j in 0..adds_per_thread {
//randomly generate and add a (key, value)
let key = thread_rng().gen::<u32>();
let value = thread_rng().gen::<u32>();
ht.set_item(key, value);
}
});

handles.push(handle);
}

for handle in handles {
handle.join().unwrap();
}

我没主意了;我的Rust代码对多线程正确吗?

最佳答案

如果您所有的线程都花所有的时间在无锁数据结构上,那么,一旦您拥有足够的线程,您将获得竞争。如果有足够多的编写者,他们将更频繁地争夺表中的同一缓存行。 (此外,在PRNG中花费的时间可能不会隐藏争用共享带宽以缓存或DRAM的争用)。

您可能会开始进行更多的CAS重试和类似的工作,包括任何争用退避机制,而不仅仅是高原。而且,线程将遭受高速缓存未命中,甚至由于某些原子读取而遭受memory-order mis-speculation pipeline clears的困扰;并非所有事物都是原子RMW或写入。

这不是无锁数据结构的正常用例。通常,您将它们与执行除锤击它们以外的重要工作的代码一起使用,因此实际争用很低。此外,哈希映射的实际工作负载很少是只写的(尽管如果您只想对某项进行重复数据删除,则可能会发生这种情况)。

读取与读者数量的比例很好,但是写入会引起争用。

关于multithreading - Rust中大量线程的性能下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59338406/

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