Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
SIMD (Tek yönerge, birden çok veri), tek bir yönerge kullanarak birden çok veri parçası üzerinde paralel olarak bir işlem gerçekleştirmek için donanım desteği sağlar. .NET'te, ad alanı altında System.Numerics SIMD hızlandırılmış türler kümesi vardır. SIMD işlemleri donanım düzeyinde paralelleştirilebilir. Bu, matematiksel, bilimsel ve grafik uygulamalarında yaygın olarak kullanılan vektörleştirilmiş hesaplamaların aktarım hızını artırır.
.NET SIMD hızlandırılmış tipler
.NET SIMD hızlandırılmış türleri aşağıdaki türleri içerir:
Vector2, Vector3 ve Vector4 türleri, 2, 3 ve 4 Single değerine sahip vektörleri temsil eder.
Matrix3x2, 3x2 boyutunda bir matrisi temsil eden ve Matrix4x4, Single değerlerinden oluşan 4x4 boyutunda bir matrisi temsil eden iki matris türü.
Plane değerleri kullanarak üç boyutlu alanda bir düzlemi temsil eden Single türü.
Quaternion değerlerini kullanarak üç boyutlu fiziksel döndürmeleri kodlamak için kullanılan bir vektörü temsil eden tür.
Vector<T> Belirtilen sayısal türde bir vektöri temsil eden ve SIMD desteğinden yararlanan geniş bir işleç kümesi sağlayan tür. Bir Vector<T> örneğin sayısı bir uygulamanın ömrü boyunca sabittir, ancak değeri Vector<T>.Count kodu çalıştıran makinenin CPU'sunun değerine bağlıdır.
Uyarı
Türü Vector<T> .NET Framework'e dahil değildir. Bu türe erişmek için System.Numerics.Vectors NuGet paketini yüklemeniz gerekir.
SIMD hızlandırmalı türler, SIMD hızlandırmalı olmayan donanımlarla veya JIT derleyicileriyle kullanılabilecek şekilde uygulanır. SIMD yönergelerinden yararlanmak için 64 bit uygulamalarınızın RyuJIT derleyicisini kullanan çalışma zamanı tarafından çalıştırılması gerekir. RyuJIT derleyicisi .NET Core ve .NET Framework 4.6 ve sonraki sürümlerde bulunur. SIMD desteği yalnızca 64 bit işlemciler hedeflendiğinde sağlanır.
SIMD nasıl kullanılır?
Özel SIMD algoritmalarını yürütmeden önce, konak makinenin SIMD'yi destekleyip desteklemediğini Vector.IsHardwareAccelerated kullanarak denetlemek mümkündür ki bu bir Boolean döndürür. Bu, SIMD hızlandırmanın belirli bir tür için etkinleştirildiğini garanti etmez, ancak bazı türler tarafından desteklendiğinin bir göstergesidir.
Basit Vektörler
.NET'teki en ilkel SIMD hızlandırmalı türler, 2, 3 ve 4 Vector2 değere sahip vektörleri temsil eden Vector3, Vector4 ve Single türleridir. Aşağıdaki örnekte iki vektör eklemek için kullanılır Vector2 .
var v1 = new Vector2(0.1f, 0.2f);
var v2 = new Vector2(1.1f, 2.2f);
var vResult = v1 + v2;
.NET vektörlerini kullanarak , Dot product
Transform
vb. gibi Clamp
vektörlerin diğer matematiksel özelliklerini hesaplamak da mümkündür.
var v1 = new Vector2(0.1f, 0.2f);
var v2 = new Vector2(1.1f, 2.2f);
var vResult1 = Vector2.Dot(v1, v2);
var vResult2 = Vector2.Distance(v1, v2);
var vResult3 = Vector2.Clamp(v1, Vector2.Zero, Vector2.One);
Matris
Matrix3x2, 3x2 matrisi ve Matrix4x44x4 matrisi temsil eder. Matrisle ilgili hesaplamalar için kullanılabilir. Aşağıdaki örnekte, SIMD kullanılarak matrisin karşılık gelen transpose matrisine çarpması gösterilmektedir.
var m1 = new Matrix4x4(
1.1f, 1.2f, 1.3f, 1.4f,
2.1f, 2.2f, 3.3f, 4.4f,
3.1f, 3.2f, 3.3f, 3.4f,
4.1f, 4.2f, 4.3f, 4.4f);
var m2 = Matrix4x4.Transpose(m1);
var mResult = Matrix4x4.Multiply(m1, m2);
Vektör<T>
, Vector<T> daha uzun vektörler kullanma olanağı sağlar. Bir Vector<T> örneğin sayısı sabittir, ancak değeri Vector<T>.Count kodu çalıştıran makinenin CPU'sunun değerine bağlıdır.
Aşağıdaki örnekte kullanarak Vector<T>iki dizinin öğe başına toplamının nasıl hesaplanması gösterilmektedir.
double[] Sum(double[] left, double[] right)
{
if (left is null)
{
throw new ArgumentNullException(nameof(left));
}
if (right is null)
{
throw new ArgumentNullException(nameof(right));
}
if (left.Length != right.Length)
{
throw new ArgumentException($"{nameof(left)} and {nameof(right)} are not the same length");
}
int length = left.Length;
double[] result = new double[length];
// Get the number of elements that can't be processed in the vector
// NOTE: Vector<T>.Count is a JIT time constant and will get optimized accordingly
int remaining = length % Vector<double>.Count;
for (int i = 0; i < length - remaining; i += Vector<double>.Count)
{
var v1 = new Vector<double>(left, i);
var v2 = new Vector<double>(right, i);
(v1 + v2).CopyTo(result, i);
}
for (int i = length - remaining; i < length; i++)
{
result[i] = left[i] + right[i];
}
return result;
}
Açıklamalar
SIMD'nin bir performans sorununu kaldırma ve bir sonrakini kullanıma sunma olasılığı daha yüksektir, örneğin bellek aktarım hızı. Genel olarak SIMD kullanmanın performans avantajı belirli senaryoya bağlı olarak değişir ve bazı durumlarda simd olmayan daha basit eşdeğer koddan daha da kötü performans gösterebilir.