【问题标题】:Memory alignment of an array at an index数组在索引处的内存对齐
【发布时间】:2017-03-19 05:27:22
【问题描述】:

是否可以告诉编译器vector[index] 对特定索引具有 128 位内存对齐?

或者,我们不能用索引来做,必须用指针来做?

【问题讨论】:

  • 我认为编译器会通过查看数组存储的数据类型来知道这一点
  • 支持比基本对齐更大的对齐(即alignof(std::max_align_t) 将始终取决于实现。也就是说,C++17 增加了对扩展对齐的更好支持,只要您使您的type 对齐,元素也会如此。另一方面,如果您的类型较小并且您只想对齐 some 元素,那么 a) 您应该重新设计代码以利用类型系统,并且 b) 您可能需要编写一些手动代码。
  • @Nana Osaberima:你的意思是只使用 128 位元素的向量吗?那么,只要我们能“告诉”编译器第 0 个元素对齐,编译器就会知道每个元素都对齐了?唔。该怎么做?
  • 在 b) 中@KerrekSB 所说的行中,您可以编写自己的类型、重载括号运算符并对索引 index 进行条件对齐移位。
  • @Pedro Boechat:即使索引指向对齐的内存地址,编译器也可能不知道...

标签: c++ vector simd memory-alignment


【解决方案1】:

我很少能回答 c 问题...但混合语言会有所帮助。

我认为他在问是否有类似 icc/ 的东西

#pragma assume aligned : 64 ::A

,或者类似的东西......在ifort它是

!DIR$ ASSUME_ALIGNED :64 :: A 

还有用于数组对齐的编译器开关,所有这些都是为了帮助内存传输。如果发现这是一个好习惯。

https://software.intel.com/en-us/node/522571

你也是英特尔网络研讨会上的一大堆关于 Xeon-Phi 和 AXV-512 的东西,所以我假设有一个 gcc 等价物。只需跳过 128 并转到 512(64 字节),然后您就可以使用 AVX 512 了;)

可以到 256 的事实似乎表明了对 AVX 2K 的希望

【讨论】:

  • 我喜欢用把太太鞋从壁橱的一侧移到另一侧的比喻。如果左手(或左脚)shoeA 在 box1 中,而右 ShoeA 是 box2 和左手 shoeB,那么当我最终将它们穿过壁橱。如果我在编译和执行/设置期间让它们与框对齐会容易得多。如果一个人只有几双鞋,就不必像 Marcos 女士的系列那样担心。对于大型 SIMD,这会有所不同。
猜你喜欢
  • 2017-11-15
  • 2013-06-12
  • 1970-01-01
  • 1970-01-01
  • 2018-05-23
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 2010-12-23
相关资源
最近更新 更多