原子加法运算与多线程多变量对比(C 语言)
Atomic addition operations vs multiple variables with multithreading (in C)
当考虑性能作为唯一因素时,为了在多线程上下文中进行极快的添加,是使用 GCC 内置同步/原子操作添加到单个变量更好,还是添加到一个变量更高效?每个线程一个计数器?
例如,如果我有 8 个线程,其中处理项目的总数必须递增(以极高的速率),是否最好有一个变量并使用原子从每个线程递增它操作,或者有 8 个单独的变量,每个线程一个,然后在某个时间间隔聚合来自 8 个变量的数据会更好吗?
每个线程分别完成其工作然后在最后聚合它很可能会快得多。 ADD 指令是指令集中最简单的指令之一,并且 运行 非常快(~1 个时钟周期)。锁定互斥量或类似对象的开销将大于实际计算。也许更重要的是,如果不共享,计数器可以驻留在寄存器中而不是主内存中,这也明显更快。
一般来说,除非万不得已,否则避免共享状态会更快也更容易。
当考虑性能作为唯一因素时,为了在多线程上下文中进行极快的添加,是使用 GCC 内置同步/原子操作添加到单个变量更好,还是添加到一个变量更高效?每个线程一个计数器?
例如,如果我有 8 个线程,其中处理项目的总数必须递增(以极高的速率),是否最好有一个变量并使用原子从每个线程递增它操作,或者有 8 个单独的变量,每个线程一个,然后在某个时间间隔聚合来自 8 个变量的数据会更好吗?
每个线程分别完成其工作然后在最后聚合它很可能会快得多。 ADD 指令是指令集中最简单的指令之一,并且 运行 非常快(~1 个时钟周期)。锁定互斥量或类似对象的开销将大于实际计算。也许更重要的是,如果不共享,计数器可以驻留在寄存器中而不是主内存中,这也明显更快。
一般来说,除非万不得已,否则避免共享状态会更快也更容易。