Training
Module
Het juiste gegevenstype in uw C#-code kiezen - Training
Kies het juiste gegevenstype voor uw code uit verschillende basistypen die in C# worden gebruikt.
Deze browser wordt niet meer ondersteund.
Upgrade naar Microsoft Edge om te profiteren van de nieuwste functies, beveiligingsupdates en technische ondersteuning.
SIMD (enkele instructie, meerdere gegevens) biedt hardwareondersteuning voor het uitvoeren van een bewerking op meerdere stukjes gegevens, parallel, met behulp van één instructie. In .NET zijn er set simd-versnelde typen onder de System.Numerics naamruimte. SIMD-bewerkingen kunnen worden geparallelliseerd op hardwareniveau. Dit verhoogt de doorvoer van de gevectoriseerde berekeningen, die gebruikelijk zijn in wiskundige, wetenschappelijke en grafische apps.
De .NET SIMD-versnelde typen omvatten de volgende typen:
De Vector2, Vector3en Vector4 typen, die vectoren vertegenwoordigen met 2, 3 en 4 Single waarden.
Twee matrixtypen, Matrix3x2die een 3x2-matrix vertegenwoordigen en Matrix4x4, die een 4x4-matrix met Single waarden vertegenwoordigt.
Het Plane type, dat een vlak in driedimensionale ruimte vertegenwoordigt met behulp van Single waarden.
Het Quaternion type, dat een vector vertegenwoordigt die wordt gebruikt om driedimensionale fysieke rotaties te coderen met behulp van Single waarden.
Het Vector<T> type, dat een vector van een opgegeven numeriek type vertegenwoordigt en een brede set operators biedt die profiteren van SIMD-ondersteuning. Het aantal exemplaren Vector<T> is vast voor de levensduur van een toepassing, maar de waarde Vector<T>.Count ervan is afhankelijk van de CPU van de computer waarop de code wordt uitgevoerd.
Notitie
Het Vector<T> type is niet opgenomen in .NET Framework. U moet het NuGet-pakket System.Numerics.Vectors installeren om toegang te krijgen tot dit type.
De SIMD-versnelde typen worden zodanig geïmplementeerd dat ze kunnen worden gebruikt met niet-SIMD-versnelde hardware of JIT-compilers. Als u wilt profiteren van SIMD-instructies, moeten uw 64-bits apps worden uitgevoerd door de runtime die gebruikmaakt van de RyuJIT-compiler . Een RyuJIT-compiler is opgenomen in .NET Core en in .NET Framework 4.6 en hoger. SIMD-ondersteuning wordt alleen geboden bij het instellen van 64-bits processors.
Voordat u aangepaste SIMD-algoritmen uitvoert, is het mogelijk om te controleren of de hostmachine SIMD ondersteunt met behulp van Vector.IsHardwareAccelerated, waarmee een Boolean. Dit garandeert niet dat SIMD-versnelling is ingeschakeld voor een specifiek type, maar is een indicator dat deze wordt ondersteund door sommige typen.
De meest primitieve SIMD-versnelde typen in .NET zijn Vector2, Vector3en Vector4 typen, die vectoren vertegenwoordigen met 2, 3 en 4 Single waarden. In het onderstaande voorbeeld worden Vector2 twee vectoren toegevoegd.
var v1 = new Vector2(0.1f, 0.2f);
var v2 = new Vector2(1.1f, 2.2f);
var vResult = v1 + v2;
Het is ook mogelijk om .NET-vectoren te gebruiken om andere wiskundige eigenschappen van vectoren zoals Dot product
, Transform
Clamp
enzovoort te berekenen.
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);
Matrix3x2, dat een 3x2-matrix vertegenwoordigt en Matrix4x4, die een 4x4-matrix vertegenwoordigt. Kan worden gebruikt voor matrixgerelateerde berekeningen. In het onderstaande voorbeeld ziet u hoe een matrix wordt vermenigvuldigd met de bijbehorende correspondenttransponerende matrix met behulp van SIMD.
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);
De Vector<T> geeft de mogelijkheid om langere vectoren te gebruiken. Het aantal exemplaren Vector<T> is vast, maar de waarde Vector<T>.Count ervan is afhankelijk van de CPU van de computer waarop de code wordt uitgevoerd.
In het volgende voorbeeld ziet u hoe u de som van twee matrices berekent met behulp Vector<T>van het element.
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;
}
SIMD zal waarschijnlijk één knelpunt verwijderen en de volgende, bijvoorbeeld geheugendoorvoer, beschikbaar maken. In het algemeen varieert het prestatievoordeel van het gebruik van SIMD, afhankelijk van het specifieke scenario, en in sommige gevallen kan het zelfs slechter presteren dan eenvoudigere niet-SIMD-equivalente code.
.NET-feedback
.NET is een open source project. Selecteer een koppeling om feedback te geven:
Training
Module
Het juiste gegevenstype in uw C#-code kiezen - Training
Kies het juiste gegevenstype voor uw code uit verschillende basistypen die in C# worden gebruikt.