0

假设我们有这样的代码:

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_data1inter_data2 16 字节对齐。对齐这些指针的最佳(安全且开销最小)方法是什么?我考虑std::align,但我不确定这是正确的选择。

4

2 回答 2

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;

希望有帮助!

于 2013-07-26T22:03:23.930 回答
1

_aligned_malloc在 Windows 或Linux 上分配内存memalign,然后您的指针将在堆栈上对齐。或者,如果要对齐堆上的内存,则可以使用#pragma pack.

于 2013-07-27T01:07:13.340 回答