0

Clang has a C/C++ extension that which allows you to treat vector values as first-class citizens:

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}

I would believe that these vectors make use of the underlying platform's SIMD instructions (SSE on Intel Macs, NEON on ARM). However, I'm not too sure how the Mac OS calling convention deals with vector types.

Will it be more efficient to pass vectors by reference or by copy? The difference might not be huge, but since I'll be passing around a lot of vectors, I figured I might pick up the right habit as soon as possible.

4

1 回答 1

1

快速测试表明,在您的示例中,double4参数在堆栈上传递,但在寄存器 xmm0 和 xmm1 中返回。这有点奇怪。float4另一方面,参数在寄存器 xmm0 到 xmm7 中传递,结果在 xmm0 中返回,如您所料。

Apple 使用System V 应用程序二进制接口。AMD64 架构处理器补充。对于 Mac OS X。如果我正确解释了该文档,则所有内容都应在寄存器中传递。我不确定clang在这里做什么。也许这仍在进行中,将来可能会改变?如果他们这样做了,当您尝试混合新旧行为时,它可能会破坏您的程序。

为了性能,使用 clang 传递每个值的向量不是问题。如果您的功能不是非常短,则应该没有明显的区别。如果您确实使用了非常小的函数,您应该尝试说服编译器将它们内联(例如通过声明它们static)。

编辑:关于 AVX 扩展:如果启用它们,编译器使用寄存器 ymm0 到 ymm7 作为参数,使用 ymm0 作为结果。在这种情况下,double4 占用单个 ymm 寄存器而不是 xmm 寄存器对。

于 2013-05-17T00:12:59.060 回答