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

标签 c caching memory gnu mips32

我正在研究 mips32,具有 micro-mips 优化的 gcc 编译器。每个核心都有自己的高速缓存。核心 A 操作系统 - ThreadX,核心 B 操作系统 - 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,请不要在如此低的级别进行推理。如果您不关心,请查看编译器生成的汇编代码(例如,将 gcc -O -fverbose-asm -SGCC 一起使用)。

如果您关心特定的实现,您应该提及它(编译器和版本、optimization 标志、操作系统、处理器和品牌)。但要小心undefined behavior ,为scared布法罗大学。

如果用 C: 和 C99 进行编码,您需要操作系统的东西和支持,例如pthreads(7) (使用 futex(7) )。所以请阅读pthread tutorial 。对于符合 C11 的实现(请参阅 n1570 ),您可以使用 atomic operations ,和 <threads.h>

Do I have to work with an aligned address?

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

关于c - 为什么需要缓存内存对齐?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48073612/

相关文章:

c - WELLRNG512 的实现

c - 文件可以打开但无法读取 QNX

http - Cache-Control : max-age=0 and no-cache?有什么区别

python - 我什么时候应该使用 Pandas 的 Categorical dtype?

c - 如何创建结构体c的动态矩阵?

c++ - 为变量分配新值时内存泄漏?

c - 使用链表将字符串插入堆栈

c - 如何用按钮填充 gtk 网格?

MySQL查询缓存工作

php - 缓存 PHP 数组