Каков наилучший способ извлечения примитивных числовых типов из содержащей структуры с помощью дженериков?
Несколько примитивных числовых типов заключены в неуправляемую, универсальную и изменяемую структуру, которая доступна только через универсальный контекст и предполагается, что ее размер равен множеству 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, будет наиболее эффективным? одну и ту же арифметическую операцию с несколькими (2–6) общими числами?
И затем, как только TNum были «извлечены», какова эффективность mst способ выполнения той же арифметики операцию над ними в общем контексте (мы не знаем заранее, каким конкретным примитивным типом TNum будет в конечном итоге)?
Итак, учитывая поддержку общих математических вычислений в .NET 8+, я ищу наиболее эффективный способ выполнения базовой арифметики над универсальными примитивами TNums (например, byte) , короткий, int, float и несколько других) когда их несколько (т.е. больше 1, но меньше, скажем, 6 - аналогично примеру структуры выше).
Можно использовать System.Numerics.Vector и System.Numerics.Vector, однако проблема в том, что размер вектора должен соответствовать общему размеру примитивов, которые вы используете. работают, что невозможно в обычном сценарий.
Итак, существует ли какой-то общий подход, который будет работать на современных процессорах независимо от базового типа примитива, например, SIMD-добавление трех примитивных чисел или добавление константы ко всем трем из них? Можно использовать небезопасный код.
ОБНОВЛЕНИЕ:
Просто для пояснения:
< ul>
[*]Этот вопрос не касается конкретной проблемы, а скорее относится к любому неуправляемому (не содержит указателей на управляемые объекты) и mutable структура, которая для целей этого вопроса на самом деле является просто блок битов в памяти, где заранее известно, что он кратен по размеру TNum и его расположение является последовательным.[*]Код будет выполняться много миллионов раз, поэтому производительность является проблемой, и если бы было нормально выполнять это по одному полю за раз, я бы не задавал этот вопрос. >
Подробнее здесь: https://stackoverflow.com/questions/791 ... ers-contai