为什么需要缓存内存对齐?

问题描述 投票:0回答:1

我正在使用mips32,gcc编译器进行micro-mips优化。每个核心都有自己的缓存。 Core A os - ThreadX,Core B os - rtos。我希望将指针和大小从Core A传递到Core B.让我们看一下以下流程:

1. Core A(ThreadX): pass pointer and size to Core B
2. Core B(RTOS): write to pointer size bytes
3. Core B(RTOS): flush(pointer)
4. Core A(ThreadX): pointer cacheInvalidate(pointer)
5. Core A(RTOS): copy from pointer to buffer

我使用未对齐的地址,似乎它引起了一些意想不到的问题。通过对齐的地址后,我无法重现问题。我是否必须使用对齐的地址?为什么?如果我通过未对齐的地址,我应该期待什么行为?

c caching memory gnu mips32
1个回答
1
投票

如果你不关心便携式,请不要在如此低的水平上推理。如果不这样做,请查看编译器生成的汇编代码(例如,使用带有gcc -O -fverbose-asm -SGCC)。

如果你关心特定的实现,你应该提到它(编译器和版本,optimization标志,操作系统,处理器和品牌)。但要注意undefined behavior,是UB的scared

如果使用C99在C:中编码,则需要操作系统内容和支持,例如: pthreads(7)(使用futex(7))。所以读一个pthread tutorial。使用符合C11的实现(请参阅n1570),您可以使用atomic operations<threads.h>

我是否必须使用对齐的地址?

也许是的。您的硬件以与非对齐数据不同(且更快,更“原子”)的方式访问对齐数据。 Cache coherence在其细节中特定于特定处理器。

© www.soinside.com 2019 - 2024. All rights reserved.