Типы передачи, содержащие значения SSE / AVX - PullRequest
1 голос
/ 21 октября 2011

Допустим, у меня есть следующее

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

1 Ответ

3 голосов
/ 21 октября 2011

Ответ в том, что это не имеет значения.

В соответствии с этим:

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

Соглашение о вызовах гласит, что 16-байт (и, вероятно, 32-байт) операнды всегда передаются по ссылке.Таким образом, даже если вы передадите по значению, компилятор передаст его по ссылке ниже.

Другими словами, регистры XMM и YMM никогда не передаются по значению в Windows.Но нижние половины XMM0-4 все еще можно использовать для передачи 64-битных параметров по значению.

EDIT:

Во втором примере со значением float имеется небольшоеразница, поскольку она все равно будет влиять на то, будет ли b передан по ссылке или по значению.

...