Avatar von gawag
  • gawag

870 Beiträge seit 03.11.2011

Re: .NET ist doch nur ein Murkstool für Dilettanten!

IDNG7 schrieb am 13.08.2017 13:37:

gawag schrieb am 13.08.2017 01:00:

Klar kann .NET schon seit n paar Jahren SIMD.

https://www.nuget.org/packages/System.Numerics.Vectors/4.0.0

RyuJIT die NuGet Beschreibung da ist nicht mehr ganz aktuell, RyuJIT wird bei x64 .NET Framework (glaub ab 4.6) und für .NET Core (sowohl x64 als auch x86)

Hm ich finde dort nicht wirklich viele Details außer ein paar Klassennamen. Gehe ich recht in der Annahme, dass ich keinerlei Integer Operationen benutzen kann?
https://software.intel.com/sites/landingpage/IntrinsicsGuide/#techs=SSE2,AVX2
Oder sowas wie mask, pack, unpack, and, or, ...?

pack/unpack funktioniert über die Vector<T>/VectorN (wobei n = 2, 3, oder 4 ist) Klassen.

// valuesIn has 16 float elements var valuesIn = new float[] {4f, 16f, 36f, 64f, 9f, 81f, 49f, 25f, 100f, 121f, 144f, 16f, 36f, 4f, 9f, 81f}; var valuesOut = new float[valuesIn.Length]; // Vector<int>.Length is equal to 4 when RyuJIT produces SSE2 instructions for (int i = 0; i < valuesIn.Length; i += Vector<int>.Length) { // Each vector works with 4 int values from i to i + 4 when RyuJIT produces SSE2 instructions var vectorIn = new Vector<float>(valuesIn, i); var vectorOut = vectorIn * 2f; vectorOut.CopyTo(valuesOut, i); }

Das packing hier passiert über den Vector<float> Konstruktur und unpacking über ".CopyTo", damit ist es Einheitlich zu restlichen C# semantik betrifft wenn es um Arrays und Collections betrifft.

Und je nachdem wie groß die SIMD register sind, passen mal 4 mal 8 (oder 16 bei 512 bits) integers/floats (oder halb soviele long and doubles)

[/quote]

Öhm und was ist mit 8-Bit und 16-Bit Integern? Geht also nicht so richtig.

Bewerten
- +