Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[wasm] PackedSimd, implement store methods #87828

Merged
merged 2 commits into from
Jun 21, 2023

Conversation

radekdoulik
Copy link
Member

No description provided.

@dotnet-issue-labeler
Copy link

Note regarding the new-api-needs-documentation label:

This serves as a reminder for when your PR is modifying a ref *.cs file and adding/modifying public APIs, please make sure the API implementation in the src *.cs file is documented with triple slash comments, so the PR reviewers can sign off that change.

@ghost ghost assigned radekdoulik Jun 20, 2023
@radekdoulik radekdoulik requested a review from lewing June 20, 2023 18:08
@ghost
Copy link

ghost commented Jun 20, 2023

Tagging subscribers to this area: @dotnet/area-system-runtime-intrinsics
See info in area-owners.md if you want to be subscribed.

Issue Details

null

Author: radekdoulik
Assignees: -
Labels:

area-System.Runtime.Intrinsics, new-api-needs-documentation

Milestone: -

@radekdoulik
Copy link
Member Author

Test methods:

    unsafe static void TestStoreLane()
    {
        var mem = new byte[32];
        var v = RandomByteVector;
        var v2 = RandomByteVector;
        System.Console.WriteLine($"store  v: {v}");
        System.Console.WriteLine($"store v2: {v2}");
        System.Console.Write($"mem:     ");
        for (int i = 0; i < 16; i++) {
            fixed(byte* ptr = &mem[i]) {
                AddAndStoreLaneByte(v, v2, ptr);
                System.Console.Write($"  {mem[i]}");
            }
        }
        System.Console.WriteLine();
        var memUInt = new uint[32];
        var vuint = RandomUIntVector;
        var vuint2 = RandomUIntVector;
        System.Console.WriteLine($"store  v: {vuint}");
        System.Console.WriteLine($"store v2: {vuint2}");
        System.Console.Write($"mem:     ");
        for (int i = 0; i < 4; i++) {
            fixed(uint* ptr = &memUInt[i]) {
                AddAndStoreLaneUInt(vuint, vuint2, ptr);
                System.Console.Write($"  {memUInt[i]}");
            }
        }
        System.Console.WriteLine();
        var memFloat = new float[32];
        var vFloat = RandomFloatVector;
        var vFloat2 = RandomFloatVector;
        System.Console.WriteLine($"store  v: {vFloat}");
        System.Console.WriteLine($"store v2: {vFloat2}");
        System.Console.Write($"mem:     ");
        for (int i = 0; i < 2; i++) {
            fixed(float* ptr = &memFloat[i]) {
                AddAndStoreLaneFloat(vFloat, vFloat2, ptr);
                System.Console.Write($"  {memFloat[i]}");
            }
        }
        System.Console.WriteLine();
        var memdouble = new double[32];
        var vdouble = RandomDoubleVector;
        var vdouble2 = RandomDoubleVector;
        System.Console.WriteLine($"store  v: {vdouble}");
        System.Console.WriteLine($"store v2: {vdouble2}");
        System.Console.Write($"mem:     ");
        for (int i = 0; i < 2; i++) {
            fixed(double* ptr = &memdouble[i]) {
                AddAndStoreLaneDouble(vdouble, vdouble2, ptr);
                System.Console.Write($"  {memdouble[i]}");
            }
        }
        System.Console.WriteLine();
    }

    unsafe static void TestStore()
    {
        var mem = new byte[32];
        for (int i = 0; i < 16; i++) {
            var v = RandomByteVector;
            fixed(byte* ptr = &mem[i]) {
                PackedSimd.Store(ptr, v);
                System.Console.WriteLine($"store v: {v}");
                System.Console.Write("mem:    ");
                for (int j=0; j < 16; j++)
                    System.Console.Write($"  {mem[i+j]}");
                System.Console.WriteLine();
            }
        }
        var memUInt = new uint[8];
        for (int i = 0; i < 4; i++) {
            var v = RandomUIntVector;
            fixed(uint* ptr = &memUInt[i]) {
                PackedSimd.Store(ptr, v);
                System.Console.WriteLine($"store v: {v}");
                System.Console.Write("mem:    ");
                for (int j=0; j < 4; j++)
                    System.Console.Write($"  {memUInt[i+j]}");
                System.Console.WriteLine();
            }
        }
        var memDouble = new double[4];
        for (int i = 0; i < 2; i++) {
            var v = RandomDoubleVector;
            fixed(double* ptr = &memDouble[i]) {
                PackedSimd.Store(ptr, v);
                System.Console.WriteLine($"store v: {v}");
                System.Console.Write("mem:    ");
                for (int j=0; j < 2; j++)
                    System.Console.Write($"  {memDouble[i+j]}");
                System.Console.WriteLine();
            }
        }
    }

    [MethodImpl(MethodImplOptions.NoInlining)]
    static unsafe void AddAndStoreLaneByte(Vector128<byte> v1, Vector128<byte> v2, byte* ptr)
    {
        var v = PackedSimd.Add (v1, v2);
        PackedSimd.StoreSelectedScalar (ptr, v, (byte)5);
        PackedSimd.StoreSelectedScalar (ptr+1, v, (byte)2);
        PackedSimd.StoreSelectedScalar (ptr+2, v, (byte)7);
        PackedSimd.StoreSelectedScalar (ptr+3, v, (byte)11);
    }

    [MethodImpl(MethodImplOptions.NoInlining)]
    static unsafe void AddAndStoreLaneUInt(Vector128<uint> v1, Vector128<uint> v2, uint* ptr)
    {
        var v = PackedSimd.Add (v1, v2);
        PackedSimd.StoreSelectedScalar (ptr, v, (byte)2);
        PackedSimd.StoreSelectedScalar (ptr+1, v, (byte)3);
        PackedSimd.StoreSelectedScalar (ptr+2, v, (byte)1);
    }

    [MethodImpl(MethodImplOptions.NoInlining)]
    static unsafe void AddAndStoreLaneFloat(Vector128<float> v1, Vector128<float> v2, float* ptr)
    {
        var v = PackedSimd.Add (v1, v2);
        PackedSimd.StoreSelectedScalar (ptr, v, (byte)2);
        PackedSimd.StoreSelectedScalar (ptr+1, v, (byte)3);
        PackedSimd.StoreSelectedScalar (ptr+2, v, (byte)1);
    }

    [MethodImpl(MethodImplOptions.NoInlining)]
    static unsafe void AddAndStoreLaneDouble(Vector128<double> v1, Vector128<double> v2, double* ptr)
    {
        var v = PackedSimd.Add (v1, v2);
        PackedSimd.StoreSelectedScalar (ptr, v, (byte)1);
        PackedSimd.StoreSelectedScalar (ptr+2, v, (byte)0);
    }

output:

store v: <117, 173, 66, 144, 52, 239, 14, 55, 0, 194, 116, 105, 250, 87, 206, 155>
  mem:      117  173  66  144  52  239  14  55  0  194  116  105  250  87  206  155
  store v: <63, 109, 19, 55, 2, 220, 160, 164, 204, 154, 134, 112, 161, 5, 140, 64>
  mem:      63  109  19  55  2  220  160  164  204  154  134  112  161  5  140  64
  store v: <26, 101, 1, 239, 137, 222, 59, 195, 146, 216, 83, 88, 200, 212, 46, 157>
  mem:      26  101  1  239  137  222  59  195  146  216  83  88  200  212  46  157
  store v: <142, 177, 59, 49, 117, 182, 252, 208, 12, 115, 156, 0, 220, 235, 134, 202>
  mem:      142  177  59  49  117  182  252  208  12  115  156  0  220  235  134  202
  store v: <217, 241, 160, 0, 92, 170, 4, 169, 185, 202, 209, 183, 132, 165, 244, 21>
  mem:      217  241  160  0  92  170  4  169  185  202  209  183  132  165  244  21
  store v: <244, 78, 253, 232, 143, 44, 49, 37, 252, 113, 213, 9, 114, 199, 42, 65>
  mem:      244  78  253  232  143  44  49  37  252  113  213  9  114  199  42  65
  store v: <182, 19, 98, 30, 223, 133, 126, 194, 151, 131, 68, 140, 200, 35, 4, 6>
  mem:      182  19  98  30  223  133  126  194  151  131  68  140  200  35  4  6
  store v: <54, 108, 27, 227, 148, 59, 50, 145, 136, 244, 43, 198, 182, 207, 221, 168>
  mem:      54  108  27  227  148  59  50  145  136  244  43  198  182  207  221  168
  store v: <87, 134, 188, 110, 97, 7, 174, 51, 0, 127, 220, 153, 168, 12, 228, 211>
  mem:      87  134  188  110  97  7  174  51  0  127  220  153  168  12  228  211
  store v: <92, 133, 247, 249, 204, 134, 154, 155, 10, 146, 211, 201, 127, 160, 88, 32>
  mem:      92  133  247  249  204  134  154  155  10  146  211  201  127  160  88  32
  store v: <96, 5, 203, 0, 240, 58, 103, 130, 109, 214, 196, 248, 145, 42, 252, 170>
  mem:      96  5  203  0  240  58  103  130  109  214  196  248  145  42  252  170
  store v: <144, 207, 254, 244, 157, 21, 0, 96, 125, 204, 211, 109, 118, 53, 158, 6>
  mem:      144  207  254  244  157  21  0  96  125  204  211  109  118  53  158  6
  store v: <98, 116, 184, 75, 248, 201, 12, 235, 86, 230, 188, 142, 65, 128, 167, 9>
  mem:      98  116  184  75  248  201  12  235  86  230  188  142  65  128  167  9
  store v: <11, 25, 218, 151, 72, 76, 219, 202, 249, 126, 59, 184, 244, 4, 135, 49>
  mem:      11  25  218  151  72  76  219  202  249  126  59  184  244  4  135  49
  store v: <55, 12, 66, 128, 33, 84, 16, 163, 117, 229, 54, 216, 206, 84, 171, 154>
  mem:      55  12  66  128  33  84  16  163  117  229  54  216  206  84  171  154
  store v: <21, 142, 71, 53, 204, 33, 134, 17, 149, 46, 72, 49, 97, 189, 76, 11>
  mem:      21  142  71  53  204  33  134  17  149  46  72  49  97  189  76  11
  store v: <724078740, 108220663, 656527309, 1502734651>
  mem:      724078740  108220663  656527309  1502734651
  store v: <1922879322, 483655944, 1103094010, 1431166438>
  mem:      1922879322  483655944  1103094010  1431166438
  store v: <2078901068, 814392698, 427374792, 975870130>
  mem:      2078901068  814392698  427374792  975870130
  store v: <1299043465, 1606985734, 1245800259, 800066743>
  mem:      1299043465  1606985734  1245800259  800066743
  store v: <4.4542889197194E+153, -8.945975260274256E+153>
  mem:      4.4542889197194E+153  -8.945975260274256E+153
  store v: <-1.0813302999187009E+154, 1.2876150067212106E+154>
  mem:      -1.0813302999187009E+154  1.2876150067212106E+154
  store  v: <18, 132, 103, 108, 112, 175, 117, 35, 107, 118, 156, 7, 131, 247, 38, 235>
  store v2: <222, 206, 245, 126, 171, 181, 220, 165, 49, 25, 21, 26, 144, 83, 187, 254>
  mem:       100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100
  store  v: <698743856, 1370067327, 1301073778, 812248499>
  store v2: <2116578198, 352804974, 1298483573, 1864132694>
  mem:       2599557351  2599557351  2599557351  2599557351
  store  v: <1.2762932E+19, -4.5795344E+18, 7.776362E+18, -6.0136815E+18>
  store v2: <-1.1721688E+19, -9.542314E+18, 1.8291103E+19, 9.44995E+18>
  mem:       2.6067464E+19  2.6067464E+19
  store  v: <-3.309235460147638E+152, 1.2595791886048362E+154>
  store v2: <-2.061471279565945E+153, -6.855126615164575E+153>
  mem:       5.740665270883787E+153  5.740665270883787E+153

emitted code check:

> wa-info -d -f TestStore src/mono/sample/wasm/console-node/bin/Debug/AppBundle/dotnet.native.wasm|grep 'v128.store *\[SIMD\]'
     v128.store    [SIMD]
> wa-info -d -f AddAndStoreLane src/mono/sample/wasm/console-node/bin/Debug/AppBundle/dotnet.native.wasm|grep lane
 v128.store8.lane 11    [SIMD]
 v128.store8.lane 7    [SIMD]
 v128.store8.lane 2    [SIMD]
 v128.store8.lane 5    [SIMD]
 v128.store32.lane 1    [SIMD]
 v128.store32.lane 3    [SIMD]
 v128.store32.lane 2    [SIMD]
 v128.store32.lane 1    [SIMD]
 v128.store32.lane 3    [SIMD]
 v128.store32.lane 2    [SIMD]
 v128.store64.lane 0    [SIMD]
 v128.store64.lane 1    [SIMD]

@lewing lewing requested a review from kg June 20, 2023 19:56
@radekdoulik radekdoulik merged commit 5b900dd into dotnet:main Jun 21, 2023
@ghost ghost locked as resolved and limited conversation to collaborators Jul 21, 2023
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants