Извлечение примитивных числовых типов из содержащей структуры с помощью дженериков:
Несколько примитивных числовых типов типы заключены в неуправляемую универсальную структуру, которая доступна только через универсальный контекст и предполагается, что ее размер равен кратному размеру TNum:
Код: Выделить всё
static unsafe void Add(TStruct s, TNum n) where TNum : unmanaged, INumber where TStruct : unmanaged {
}
Что такое наиболее эффективный способ «извлечь» отдельные TNum из таких общих структур:
Код: Выделить всё
static unsafe void Add(TStruct s, TNum n) where TNum : unmanaged, INumber where TStruct : unmanaged {
ref var v0 = ref Unsafe.AsRef(Unsafe.AsPointer(ref s));
ref var v1 = ref Unsafe.AsRef(Unsafe.Add(Unsafe.AsPointer(ref s), 1));
...
v0 = ...
v1 = ...
}
Код: Выделить всё
static unsafe void Add(TStruct s, TNum n) where TNum : unmanaged, INumber where TStruct : unmanaged {
var v = (TNum*)Unsafe.AsPointer(ref s);
v[0] = ...
v[1] = ...
}
Что-то еще?
Арифметика с помощью SIMD для НЕСКОЛЬКИХ общих чисел:
Учитывая поддержку общих математических вычислений в DotNet 8+, я ищу наиболее эффективный способ выполнения основных арифметических операций с универсальными примитивами TNum (например, byte, short, int, float и некоторые другие) когда их несколько (т.е. более 1, но меньше, чем, скажем, 6 – аналогично приведенному выше примеру структуры).
Можно использовать System.Numerics.Vector и System.Numerics.Vector, однако проблема в том, что размер вектора должен соответствовать общему размеру примитивов, с которыми вы работаете, что невозможно в общем сценарии.
Так есть ли какие-нибудь общий подход, который будет работать на современных процессорах независимо от базового типа примитива, например, SIMD-добавление трех примитивных чисел или добавление константы ко всем трем из них? Можно использовать небезопасный код.
Подробнее здесь: https://stackoverflow.com/questions/791 ... ers-contai