Каков наиболее эффективный способ выполнения арифметических действий с несколькими общими числами, содержащимися в общейC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Каков наиболее эффективный способ выполнения арифметических действий с несколькими общими числами, содержащимися в общей

Сообщение Anonymous »

Каков наиболее эффективный способ выполнения арифметических операций над несколькими общими числами, завернутыми в неуправляемую, универсальную и изменяемую структуру на C# в DotNet 8+? МОЖНО использовать небезопасный код.
Наиболее эффективный способ извлечь примитивные числовые типы из содержащей структуры с помощью дженериков?
Несколько примитивных числовых типов заключены в неуправляемую, универсальную и изменяемую структуру, которая доступна только через общий контекст и предполагается, что ее размер равен множеству. em> размера TNum:

Код: Выделить всё

static unsafe void Add(TStruct s, TNum n) where TNum : unmanaged, INumber where TStruct : unmanaged {

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


Подробнее здесь: https://stackoverflow.com/questions/791 ... ers-contai
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»