【发布时间】:2012-03-25 09:01:20
【问题描述】:
在我的程序中,我有一个函数可以进行简单的向量加法c[0:15] = a[0:15] + b[0:15]。函数原型为:
void vecadd(float * restrict a, float * restrict b, float * restrict c);
在我们的 32 位嵌入式架构上,有一个加载/存储双字的加载/存储选项,例如:
r16 = 0x4000 ;
strd r0,[r16] ; stores r0 in [0x4000] and r1 in [0x4004]
GCC 优化器识别循环的向量性质并生成代码的两个分支 - 一个用于 3 个数组是双字对齐的情况(因此它使用双加载/存储指令),另一个用于这种情况数组是字对齐的(它使用单个加载/存储选项)。
问题在于地址对齐检查相对于加法部分来说代价高昂,我想通过提示编译器 a、b 和 c 总是 8 对齐来消除它。是否有一个修饰符可以添加到指针声明中来告诉编译器?
用于调用该函数的数组具有aligned(8) 属性,但并不反映在函数代码本身中。是否可以将此属性添加到函数参数中?
【问题讨论】:
-
即使我下面的代码不能帮助你(因为它是 C++),你可能只想在你的代码中 printf("%p") &array[0] 和 &array[1]确保遵守对齐,并且每个元素 - 不仅仅是在数组起始地址上。
-
@Joe - 实际上要求它不对齐每个数组元素。它确实必须是一个连续的浮点数组,其原点是 8 对齐的。