【问题标题】:SIMD Intrinsics and PointersSIMD 内部函数和指针
【发布时间】:2012-11-05 04:30:53
【问题描述】:

我读到的所有关于将 C/C++ 内在类型用于 MMX 和 SSE 等 SIMD 功能的信息都表明,您应该将它们用作不透明类型,而不是直接引用内部。

但是,当我查看许多示例时,它们的工作原理是采用(显式对齐)指向原始数据的指针,并在执行工作之前将它们重新解释为指向内部类型的指针。但是,通过使用指向内在类型的指针,尤其是在将其他数据别名为这些类型时,您是否违反了该规则?

【问题讨论】:

  • 通常指向原始数据的指针是unsigned char*void*,在指针别名方面有特殊的规则。一旦有了实际的内在类型,就可以使用内在类型指针来引用它。

标签: c++ c simd intrinsics


【解决方案1】:

你似乎发现大多数例子都很糟糕。

引用 SSE 类型的“内部”实际上是相当安全的(只要它可以编译),实际上您可以将内存中的它们别名为内存中的“普通”数据类型, 很多人这样做是因为它使代码更方便编写和使用。

但这几乎破坏了使用 SIMD 的意义。它阻止了很多优化,这意味着编译器必须不断地存储/加载 SIMD 数据类型,而不仅仅是将它们保存在 SIMD 寄存器中。

可以这样做,但你不应该不这样做。正如您所发现的,许多人将“应该”理解为“随意这样做”。

【讨论】:

  • 这就是我的想法,除了可移植性之外,它当然可以工作,但编译器会为这些特定实例生成次优代码。
猜你喜欢
  • 2013-12-29
  • 2016-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-13
  • 2012-01-02
  • 2012-10-17
相关资源
最近更新 更多