假设我们有这段代码:
float *data = (float*)_mm_malloc(N*sizeof(float), 16);//allocate 16-byte aligned array of N elements
const int loop_bound1 = .....;//some value
const int loop_step = .....;//some value
const int loop_bound2 = ....;//some value
for(auto i=0; i<loop_bound; i+=loop_step)
{
auto inter_data1 = data + i;//inter_data1 may be not aligned
for(int j=0; j<loop_bound2; ++j)
{
auto inter_data2 = inter_data1 + j;//inter_data2 also may be not aligned
__m128 a = _mm_loadu_ps(inter_data2);//it's ok, but I want use _mm_load_ps instead
}
}
调用 _mm_load_ps 而不是 _mm_loadu_ps 需要保持 inter_data1 和 inter_data2 16字节对齐。 对齐这些poinetrs的最佳方法(安全且开销最小)是什么?我认为 std :: align ,但我不确定这是正确的选择。
答案 0 :(得分:1)
标准实施将使用:
__declspec( align( n ) )
...其中'n'是您需要将数据类型对齐的字节数。您可以为各种对齐构建一些宏,例如:
#define AALIGN( n ) __declspec( align( n ) )
#define AALIGN4 __declspec( align( 4 ) )
#define AALIGN8 __declspec( align( 8 ) )
#define AALIGN16 __declspec( align( 16 ) )
#define AALIGN32 __declspec( align( 32 ) )
#define AALIGN64 __declspec( align( 64 ) )
...然后您可以声明您的数据:
AALIGN16 float m_fMyAlignedFloat;
希望有所帮助!
答案 1 :(得分:1)
在Windows上使用_aligned_malloc
或在Linux上使用memalign
分配内存,然后您的指针将在堆栈上对齐。或者,如果要在堆上对齐内存,则可以使用#pragma pack
。