传递包含SSE/AVX值的类型

Passing types containing SSE/AVX values

本文关键字:类型 AVX 包含 SSE      更新时间:2023-10-16

假设我有以下内容

struct A
{
    __m256 a;
}
struct B
{
    __m256 a;
    float b;
}

在硬核循环中,以下哪个通常更好(如果有的话,为什么)?

void f0(A a) { ... }
void f1(A& a) { ... } //and the pointer variation
void f2(B b) { ...}
void f3(B& b) { ... } //and the pointer variation

答案是没关系。

根据这个:

http://msdn.microsoft.com/en-us/library/ms235286.aspx

调用约定声明16字节(也可能是32字节)的操作数总是通过引用传递。所以即使你按值传递,编译器也会在下面通过引用传递。

换句话说,XMM和YMM寄存器在Windows中从不按值传递。但是XMM0-4的下半部分仍然可以用于按值传递64位参数。

编辑:

float值的第二个示例中,有一点不同,因为它仍然会影响b是通过引用传递还是通过值传递。