【问题标题】:How to align __m256d inside a struct?如何在结构内对齐 __m256d?
【发布时间】:2017-12-05 16:12:16
【问题描述】:

考虑以下代码:

// Thin/POD struct
struct Data {
 __m256d a;
 __m256d b;
};
// Thick base class
class Base {
  // ...
};
// Thick derived class
class Derived : public Base {
  Data data;
  // ...
};

有没有办法确保Derived::data 成员为 AVX 正确对齐(32 字节对齐)? 因为派生类有一个基类,所以似乎没有办法让class alignas(32) Deriveddata 作为Derived 的第一个成员。

Derived 当前仅在堆栈上分配,但以后可能还需要堆分配。

更新:编译器是 MSVC++2017 ,因此(部分)支持 C++11/14/17。

【问题讨论】:

  • 据我所知,对齐约束从单个字段传播到包含它们的聚合。因此,__m256d 字段的对齐约束应该传播到Data 结构,然后再传播到Derived 结构。但是您可以通过使用 alignas(__m256d) 显式注释它来确保 Data 字段对齐(或者,如果您没有 C++11 支持,则无论您使用的编译器的语法是什么)。跨度>
  • 您是否注意到任何错位?它应该自动工作,可能会在对象中间留下填充空间。动态分配是另一回事,显然VC++还不支持“过度对齐的动态内存分配”。
  • @MarcGlisse,不,我还没有注意到任何错位。但我也想知道潜在的错误,在它们发生之前。您能否指出一些有关 MSVC++(不)支持“过度对齐的动态内存分配”的链接?我在互联网上找不到它,除了通用 open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0035r1.html
  • 谢谢,我现在清楚了。有人想将这些 cmets 组合成一个答案吗?

标签: c++ struct alignment sse avx


【解决方案1】:

对于堆栈上的对象,从字段到封闭数据结构的对齐方式是properly propagated

此外,alignas 可以是used on data members

struct S{};

struct T
{
    char c;
    S alignas(32) s;
};

对于堆上的对象,在 C++17 之前自动对齐 isn't guaranteed

在 C++17 中,有几种方法可以在堆上分配对齐的内存。

struct alignas(32) S {};

auto s1 = std::aligned_alloc(alignof(S), sizeof(S));

auto s2 = new S; // has the meaning of...
auto s2_ = new (std::align_val_t(alignof(S))) S; 

auto sz = alignof(S) + sizeof(S) - 1;
auto s3 = std::malloc(sz);
std::align(alignof(S), sizeof(S), s3, sz);

参考:
aligned_alloc
new
align

为了个人恩惠和世界和平,请不要使用std::align

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-08
    • 2021-11-16
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多