假设我有一个从地址0到128的连续内存部分,并且将它整齐地平分,以便每个第六个字节工作6个线程,线程1得到0, 6, 12, 18...
,线程2得到1, 7, 13, 19...
,等等
如果这些线程写入这些字节,是否会导致CPU尝试同步每个内核上的缓存,因为它们彼此之间是本地的?如果每个字节都以std::atomic<uint8>
访问怎么办?
答案 0 :(得分:3)
我不了解所有CPU,因为我最熟悉Intel 64位。虽然一般来说,如果至少有一个线程正在写入内存,我会说是。
这与缓存行有关。在我的PC中,缓存行是64字节(不是位),您可以通过std::hardware_destructive_interference_size来检索该数字。
无视这一点,您陷入了一个陷阱:错误共享。这是您写入同一高速缓存行上无关值的高速缓存行无效。
您可以使用std::memory_order来防止这种情况,但是,该值是最低要求,由于CPU本身保证了std :: memory_order_seq_cst,因此在大多数情况下,在Intel 64bit上,该值会被忽略。它可能仍然对优化有影响。 (对于可以处理原子的小优化过程)
总结:尽可能地给线程的内存区域分配iso随机元素。