【发布时间】:2014-08-16 08:21:27
【问题描述】:
我从来没有完全理解函数中的堆栈对齐和“对齐的加载/存储”到堆栈之间的区别。
我正在阅读一些 PTX 代码并且我看到了这个:
function()
.local .align 16 .byte stack_memory[200];
// This should mean the stack memory starts at an address aligned to 16 (why would this be necessary?)
load_byte_from_stack reg, [stack_memory+1];
// It seems reading 1 byte is always safe (why?)
load_float32_from_stack reg, [stack_memory+8];
// It also seems that reading 32 bit from an address aligned to 32 bit (4 bytes) is also safe (why??)
load_two_float32_from_stack reg, [stack_memory+12];
// This should not be right (why?)
我的问题在代码中,但重点是:
我真的不明白为什么堆栈分配应该与地址对齐,以及如果我可以从完全未对齐的地址读取 1 个字节并从仅是 4 的倍数的地址读取 float32,为什么这很重要/p>
【问题讨论】:
-
并非所有架构都允许未对齐的访问,即使是那些这样做的架构也经常会降低性能。
-
好吧,如果我将堆栈内存对齐到 16,我怎么能读取对齐到 4 的任何地方的浮点数?这听起来很奇怪.. 为什么一开始就将所有的东西都对齐到 16?
标签: c performance optimization memory-management cuda