我已经在这里找到了很多关于这个主题的内容(例如,stackoverflow.com/questions/1713554/threads-processes-vs-multithreading-multi-core-multiprocessor-how-they-are或{{3} }和其他地方(例如,ixbtlabs.com/articles2/cpu/rmmt-l2-cache.html或software.intel.com/en-us/articles/multi-core-introduction/),但我仍然不确定一些看似非常简单的事情。所以我想我只是问。
(1)是一个多核处理器,其中每个核心的专用缓存与多处理器系统有效相同(当然,处理器速度,缓存大小等均衡)?
(2)假设我有一些要分析的图像(即计算机视觉),我将这些图像加载到RAM中。我的应用程序为每个需要分析的图像生成一个线程。共享缓存多核处理器上的这个应用程序是否会比专用缓存多核处理器运行得慢,后者的运行速度是否与等效的单核多处理器机器相同?
感谢您的帮助!
答案 0 :(得分:0)
缓存的大小很重要。为此,我假设x86处理器并且只使用L2缓存,这是在双核处理器上共享的。
如果您将2个单核处理器与1个双核处理器进行比较,并且单核处理器都具有相同数量的数据缓存(以相同的速度运行),那么您拥有更多缓存,因此图像的更多部分可以适合缓存,如果图像数据的处理必须反复加载和/或存储到这些数据,很可能会以相同的时钟速度更快地进行。
如果您要比较2个单核处理器和1个双核处理器,其数据缓存是每个单核处理器数据缓存的两倍,那么大约一半的数据缓存将用于每个处理器的工作。除了每个独立线程必须使用的图像数据之外,还有可能存在一些共享数据。如果此共享数据存储在共享数据高速缓存中,则可以更容易地在两个内核之间共享,而不是在2xSingle内核设置上共享。在每个共享数据块的2xSingle核心设置中,其中一个缓存会存储它,当另一个处理器需要使用该数据时会有一点开销。
双核机器也使线程更容易在同一处理器模块上从一个核心迁移到另一个核心,因为线程的新处理器的缓存不需要填充,而另一个具有不需要的数据不再占用空间。
我建议无论你最终做什么,你都会尝试将线程数量限制在每个核心3到10个,以便一般使用。线程将相互竞争该缓存空间,因此太多将使得在重新调度该线程之前将1个线程中的所有数据都推出。此外,如果每个线程都可以遍历几个图像文件,那么通过鼓励每个线程的堆栈空间保留在缓存中可以获得一点点,因为堆栈较少。您还可以减少操作系统用来跟上线程的内存量。
您最大的胜利就是当您可以通过缓慢访问(例如磁盘,网络或人工交互)重叠处理时,因此只需要足够的线程来保持CPU忙于处理。