如果每个线程都有自己的只读数组副本,线程会更快吗

时间:2019-01-01 01:03:26

标签: c++ multithreading c++11

如果我有多个线程,每个线程都基于联合只读数组进行一些计算,那么如果我为每个数组提供该数组的单独副本,速度会更快。例如,假设X是具有以下内容的数组  0和1之间的数字和线程n计算sin(nX)(对数)。我应该为每个线程创建X的深层副本吗?

我当然可以尝试一下,但是首先我必须学习如何实现线程。我想在C ++中这样做,以防万一。

2 个答案:

答案 0 :(得分:5)

通常来说,制作每线程只读数据副本没有任何优势。每个CPU都已经在缓存中保留了自己最近访问的内存副本,并且如果数据是只读的,则不需要通过其他CPU的写操作来使缓存无效。

如果访问所谓的只读数据实际上涉及隐藏的写操作,例如更新参考计数(如果您使用的是var dt = DateTime.ParseExact("2019/01/17 01:01", "yyyy/MM/dd HH:mm", System.Globalization.CultureInfo.InvariantCulture); Console.WriteLine("{0}", dt); ),则情况可能会有所不同。

答案 1 :(得分:3)

首先,我想提一下,对于CUDA来说,这可能是个好工作。

通过这种方式,同一阵列的多个副本不太可能帮助提高性能。如果有的话会降低性能。如果它们是只读的,则不需要互斥,因此它们仍可以同时从同一块内存中读取。最重要的是,如果每个线程都有自己的副本,那么您必须做一个相当慢的副本。

最后,这可能是最重要但最微妙的部分,如果您只有一个内存块,那么CPU可以将其复制到其缓存中,这将大大提高性能。