关于多核CPU或多处理器系统中使用的高速缓存存储器,我有几个问题.(虽然与编程没有直接关系,但是当一个人为多核处理器/多处理器系统编写软件时会产生很多反响,因此在这里问!)
在多处理器系统或多核处理器(Intel Quad Core,Core two Duo等......)中,每个cpu核心/处理器都有自己的缓存(数据和程序缓存)吗?
一个处理器/核心可以访问彼此的高速缓存,因为如果允许它们访问彼此的高速缓存,那么我认为可能存在较少的高速缓存未命中,如果特定处理器高速缓存没有一些数据但是其他一些处理器的缓存可能有它,从而避免从内存读入第一个处理器的缓存?这个假设是否有效且真实?
允许任何处理器访问其他处理器的高速缓冲存储器会有任何问题吗?
有人能够澄清这些东西到底是什么吗?据我所知,节点是集群内的计算点,本质上是一台计算机。任务是可以在单个节点或多个节点上执行的进程。核心基本上是指您希望在单个节点上分配多少 CPU 来执行分配给该 CPU 的任务。它是否正确?我是否混淆了什么?
我正在使用多个线程在C中实现图像过滤操作,并使其尽可能优化.我有一个问题:如果一个内存被thread-0访问,并且如果同一个内存被thread-1访问,它是否会从缓存中获取它?这个问题源于这两个线程可能运行到CPU的两个不同核心的可能性.所以另一种方法是:所有内核是否共享相同的公共缓存?
假设我有如下的内存布局
int输出[100];
假设有2个CPU核心,因此我产生两个线程同时工作.一种方案可以是将内存分成两个块,0-49和50-99,并让每个线程在每个块上工作.另一种方法是让线程0在偶数索引上工作,比如0 2 4等等.而另一个线程工作在奇数索引上,比如1 3 5 ......这个后来的技术更容易实现(特别是对于3D)数据)但我不确定我是否可以通过这种方式有效地使用缓存.
两个进程可以同时在一个具有超线程的CPU核心上运行吗?我从互联网上学习.但是,我没有看到明确的直接答案.
编辑: 感谢您的讨论和分享!我的钱包在这里发布我的问题不是讨论并行计算.它太大了,不能在这里讨论.我只想知道多线程应用程序是否可以从超线程中获益,而不是多进程应用程序.在进一步阅读之后,我有以下作为我的学习笔记.
1)启用超线程技术CPU核心有两组CPU状态和中断逻辑.同时,它只有一组执行单元和缓存.(我还没有研究什么是管道)
2)只有在某些执行的线程中发生延迟时,多线程才能从超线程中获益.我认为这一点可以准确地映射为什么以及何时软件程序员使用多线程的常见原因.如果多线程应用程序已经过优化.它可能无法从Hypter线程中获得任何好处.
3)如果CPU状态映射到进程状态,我相信Marc是正确的,多进程应用程序甚至可以从超线程技术中获益更多.
4)当CPU供应商说"线程"时,看起来他们的"线程"与我认为是java程序员的线程不同?
我正在阅读Java教程,其中提到在具有单个处理器的机器中不会发生实际的多线程.它提到操作系统为Java进程分配指定的时间,JVM线程调度程序选择一次运行一个线程的线程,持续时间很短.
我有一台四核处理器的笔记本电脑 - 通过在每个核心运行一个线程,可以以编程方式更快地运行多线程程序吗?我问这个问题的原因是因为书中提到只有真正的多处理器系统才能同时做多件事.
我想知道是否有人可以解释这两个不同的原因?它与intel硬件架构(HT)有关吗?
我遇到了一个关于线程不要访问相同缓存行的建议,我真的不明白为什么,也在对该主题进行搜索时,我遇到了这个问题: 多线程和 CPU 缓存 ,其中一个答案建议:
您只想避免两个线程同时尝试访问位于同一缓存行上的数据
在我看来,缓存存储内存页面以便从进程快速访问,正如它在这里所说:http : //en.wikipedia.org/wiki/Thread_%28computing%29#How_threads_differ_from_processes
线程共享它们的地址空间
两个线程访问相同的缓存行应该不成问题,因为如果页面在缓存中并且尝试访问内存的线程将获得缓存命中,而不管其他线程如何。
我听说过关于避免线程在几个不同的场合访问相同的缓存行的争论,所以这不是一个神话。我在这里缺少什么?
caching ×2
c ×1
cpu-cache ×1
intel ×1
java ×1
multicore ×1
multitasking ×1
performance ×1
slurm ×1
x86 ×1