相当简单的问题,但最终不是那么明显,看下面的例子:
var a = 1.0f;
var b = 2.0f;
var c = 3.0f;
var d = 4.0f;
var x = new Vector4(a * a, b * b, c * c, d * d); // not SIMD-enabled?
var y = new Vector4(a, b, c, d);
var z = y * y; // SIMD-enabled?
var w = Vector4.Multiply(y, y); // SIMD-enabled?
对于
x
,我认为它是不正确的,因为结果会立即计算并传递给ctor
。
对于
z
(以及调用 y
运算符的 *
),我认为这是正确的用法。
但我最终不确定...
如果查看源代码,就会发现
Intrisic
非公共属性:
[Intrinsic]
public Vector4(float x, float y, float z, float w)
{
X = x;
Y = y;
Z = z;
W = w;
}
也许它在幕后发挥了一些魔力,同样,不确定。
问题:
x
语法是否不利用SIMD而仅利用z
或w
语法?
你的假设是正确的
这个计算是在传递给构造函数之前进行的,因此不使用 SIMD。从阅读代码中可以明显看出这一点: a
b
c
d
不是向量,因此没有使用 SIMD。
var x = new Vector4(a * a, b * b, c * c, d * d); // not SIMD-enabled
*
运算符和
Multiply
函数被标记为
[Intrinsic]
,因为 JIT 将它们优化为使用 SIMD。您可以使用其中任何一个。
var y = new Vector4(a, b, c, d);
var z = y * y; // SIMD-enabled