在 System.Numerics 中利用支持 SIMD 的类型的正确语法?

问题描述 投票:0回答:1

相当简单的问题,但最终不是那么明显,看下面的例子:

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
语法?

c# optimization vectorization simd
1个回答
0
投票

你的假设是正确的

这个计算是在传递给构造函数之前进行的,因此不使用 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
    
© www.soinside.com 2019 - 2024. All rights reserved.