Я пытаюсь оптимизировать скорость. Я просто хочу добавить значения из одного массива в другой массив.
Это итерация по пикселям изображения, поэтому даже для большого изображения требуется совсем немного времени. Проблема в том, что когда я анимирую изображение, это становится важным.
Я начал с простого цикла for. Параллельный цикл был быстрее. Параллельный цикл с вложенным циклом for был быстрее.
Я все еще чувствую, что должно быть что-то, что использует низкоуровневые инструкции ЦП, как это делает memcopy. Добавление массивов похоже на то, что должно быть в наборе инструкций.
В приведенном ниже коде я нахожусь в банкомате.
Parallel.For(0, size.Width, (i) => {
int from = i * size.Height;
int to = from + size.Height;
for (int j = from; j < to; j++) data[j] += map.Data[j]; }
);





Adding arrays seems like something that would be in the instruction set
Он есть, он в общем называется SIMD и для x86/x64 это SSE (для ARM у вас NEON, для PowerPC AltiVec и так далее).
В C# нет языковой поддержки, но некоторые JIT-компиляторы (Mono.Simd, RyuJIT) имеют специальную поддержку для преобразования вызовов определенных библиотечных функций в инструкции SSE.
Видеть
C# поддерживает инструкции ЦП SIMD/SSE в System.Numerics. Сложение — это операция, которая использует инструкции SIMD/SSE и многоядерность до предела пропускной способности системной памяти. Взгляните на аналогичный вопрос stackoverflow Почему этот пример с добавлением массива SIMD может не демонстрировать никакого прироста производительности по сравнению с простой реализацией?
Еще одним ресурсом является пакет nuget HPCsharp на nuget.org, который я поддерживаю, взгляните на реализацию AddToSse() в AddParallel.cs.