如果我有多个线程,每个线程都基于联合只读数组进行一些计算,那么如果我为每个数组提供该数组的单独副本,速度会更快。例如,假设X
是具有以下内容的数组
0和1之间的数字和线程n计算sin(nX)
(对数)。我应该为每个线程创建X
的深层副本吗?
我当然可以尝试一下,但是首先我必须学习如何实现线程。我想在C ++中这样做,以防万一。
答案 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可以将其复制到其缓存中,这将大大提高性能。