【发布时间】:2013-05-16 22:33:11
【问题描述】:
Clang 有一个 C/C++ 扩展,它允许您将向量值视为一等公民:
typedef double double4 __attribute__((ext_vector_type(4));
// easy assignment
double4 a = {1, 2, 3, 4};
double4 b = {4, 3, 2, 1};
// basic operators work component-wise
double4 c = a + b; // {5, 5, 5, 5}
// you can even swizzle elements!
double4 d = a.zyxw; // {3, 2, 1, 4}
我相信这些向量会利用底层平台的 SIMD 指令(英特尔 Mac 上的 SSE,ARM 上的 NEON)。但是,我不太确定 Mac OS 调用约定如何处理向量类型。
通过引用或复制传递向量会更有效吗?差异可能不会很大,但由于我会传递很多向量,我想我可能会尽快养成正确的习惯。
【问题讨论】:
-
SSE 寄存器是 128 位宽,但
double4是 256 位宽。 -
@DietrichEpp,据我了解,AVX 带来了 256 位
ymm0-ymm15寄存器(xmm现在指的是低 128 位)。 -
AVX 默认不启用。
-
@DietrichEpp 由什么启用? Mac OS X 从 10.6.8 开始支持它们。如果只是编译器切换的问题,那听起来还不错。
-
对。我就是这个意思。默认不启用,必须使用
-mavx编译器标志。
标签: macos clang simd calling-convention