【问题标题】:Alignment (16-byte) of intermediate pointers dynamically动态对齐(16 字节)中间指针
【发布时间】:2013-07-26 21:34:44
【问题描述】:

假设我们有这样的代码:

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 字节块(浮点大小)逐步遍历数组,因此您肯定会在每 4 次访问时才对齐 16 字节。但是您似乎正在加载 16 字节的块。如果你真的需要你的块像这样重叠,它们不能全部对齐。如果它们不应该重叠,那么您的循环首先是错误的。

标签: c++ optimization sse memory-alignment


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    标准实现将使用:

    __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;
    

    希望有帮助!

    【讨论】:

      猜你喜欢
      • 2015-09-02
      • 2010-11-30
      • 1970-01-01
      • 2017-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-24
      • 2023-04-08
      相关资源
      最近更新 更多