C 在多核处理器中是否可以绕过一级缓存

C 在多核处理器中是否可以绕过一级缓存,c,caching,x86-64,multicore,C,Caching,X86 64,Multicore,在现代多核处理器中,我们通常有一个本地一级缓存,但有一个共享二级缓存。在仍然使用二级缓存的情况下,是否可以对内存的某些部分绕过一级缓存?我想这样做是为了提高时间的可预测性,但可能会以性能为代价。据我所知,在主流CPU上没有办法绕过一级缓存 但是,为了实现您的目标,即避免可能导致计时测量变化的缓存未命中,您可以尝试要求编译器将数据预取到缓存中 如果使用GCC或LLVM,请参阅 然而,你的问题很模糊,我不确定你的建议是否能满足你的需要。 我强烈怀疑您误解了缓存的作用和用途 从内存内容的角度来看,缓存

在现代多核处理器中,我们通常有一个本地一级缓存,但有一个共享二级缓存。在仍然使用二级缓存的情况下,是否可以对内存的某些部分绕过一级缓存?我想这样做是为了提高时间的可预测性,但可能会以性能为代价。

据我所知,在主流CPU上没有办法绕过一级缓存

但是,为了实现您的目标,即避免可能导致计时测量变化的缓存未命中,您可以尝试要求编译器将数据预取到缓存中

如果使用GCC或LLVM,请参阅

然而,你的问题很模糊,我不确定你的建议是否能满足你的需要。

我强烈怀疑您误解了缓存的作用和用途

从内存内容的角度来看,缓存是透明的。如果一个内核写入一个内存位置,那么缓存L1、L2、L3等的每一个其他内核(无论是否共享)都会碰巧缓存该位置,并且也会得到更新

请注意,这并不意味着核心无法竞争该值。您仍然可以有一个竞争条件,即一个内核在另一个内核写入一个位置之前读取该位置“获取错误的值”。此外,无论您的CPU是否具有任何类型的缓存,都会发生这种情况。要解决“排序”问题,您必须在源代码中使用信号量或其他IPC原语

某些缓存系统允许您向它们“添加提示”。Matthieu Rouget给出了一个内置预取的例子。这类事情允许程序员告诉缓存系统,提前获取一些数据是值得的。一些系统,例如PowerPC7450,允许程序员使用部分缓存作为内存,而不是缓存,这是程序员缓存控制的终极方式

然而,这些都不会对所有缓存的内存视图产生任何影响。如果一个缓存的内容得到更新,其余的也会更新

缓存与性能编程

最优秀的程序员能够通过围绕缓存的行为进行编码,从CPU中提取最高性能。在那个领域,人们通常会发现自己希望缓存根本不存在。这方面的最终实施例是PS3中的单元处理器。上的数学内核根本没有缓存。实际上,您必须自己进行数据提取,并在源代码中写回自己,而不是让缓存来猜测您的程序将需要什么数据。做对了,性能仍然非常好

公共汽车窥探

有些CPU没有缓存总线窥探,这在编写设备驱动程序时可能是一个特殊的问题。总线窥探是一种机制,CPU高速缓存通过CPU核心以外的东西(例如,通过DMA控制器从设备读取数据)来发现正在更新的内存内容。反过来也是一样——内存中的DMA获取当前卡在缓存中的值。AFAIK现在几乎所有的CPU都进行总线监听,所以这不太可能是个问题

在具有IO和内存地址空间的系统上,例如Intel,我认为不会缓存I/O地址空间。对于具有内存映射设备的系统,它们的内存通常也不会被缓存,操作系统会按照这种方式设置CPU,请参见

时间可预测性

回到问题的原因——时间的可预测性。您可能使用了错误的技术。如果您的系统有时间限制,问题在于主内存写入时间的变化,那么坦率地说,首先使用多核CPU听起来是错误的@格里维斯在这一点上说得很对,事实上整个评论都是正确的。您可能更需要求助于纯硬件设计,类似于FPGA的设计。请不要评论固件是否真的是软件


如我所怀疑的,如果您实际上试图避免使用信号量和其他IPC原语来同步系统中的两个线程,那么无论共享缓存与否,您都不会成功。您需要使用信号量等使代码正常工作。

您使用实时操作系统吗?为什么我会获得否决票?在读取或写入或两者上绕过L1?您可以获得强不可缓存或可缓存。任选一个。请记住,时间的可预测性不会有太大变化,因为x86是缓存一致的。此外,除非这是一个强实时系统,而您不能在x86上真正做到这一点,多亏了SMM和friends之类的东西,否则您不应该关心这些事情;CPU在内部方面通常比您更聪明。@osgx:在读写方面。