2013-03-30 2 views
15

Мое программное обеспечение для 3D-графики, написанное на C# с использованием SlimDX, выполняет множество векторных операций с процессором. (В этой конкретной ситуации невозможно разгрузить работу на GPU).Быстрая векторная математика в .NET. Каковы варианты?

Как я могу сделать свою векторную математику быстрее? До сих пор я нашел эти подходы:

  • Выполняется в Mono вместо Microsoft .NET, поскольку у них есть поддержка SIMD. Не вариант для этого проекта.
  • SlimGen, проект, который вводит высокопроизводительный математический код во время выполнения. К сожалению, проект еще не в состоянии использования.
  • Напишите DLL в C++, используя компилятор, который использует инструкции SSE. Взаимодействие с этой DLL из C#.

Есть ли другие возможности для ускорения векторной математики в .NET?

+19

Как это «не по теме»? Вы, люди, иногда озадачиваетесь. –

+1

Может потребоваться многопоточность (или Open MP). Я не знаю, можете ли вы использовать Open MP для .NET, но я бы порекомендовал родную dll, если вы можете поддерживать общий объем вызовов функции p/invoke на низком уровне. – dialer

+1

Поздний ответ Я знаю, но вы можете посмотреть в Yeppp!SIMD-библиотека – user9993

ответ

0

Смешивание .NET с собственным кодом. В этом случае вам понадобится один выпуск для x86 и другой для x64. Вы можете видеть Mixed (Native and Managed) Assemblies [MSDN]

8

Напишите DLL, используя компилятор Microsoft Visual C++. Используйте стандартный C++ с встроенными функциями SSE и/или OpenMP для тяжелого числового кода, с #pragma unmanaged. Используйте #pragma managed, чтобы определить чистый API C++/CLI, который может использовать C#.

C++ interop довольно немного быстрее, чем p/invoke. И C++/CLI - единственный изящный способ обработки как собранной памяти мусора, так и предположений собственных функций (блоки памяти не будут перемещаться).

Возможно, вы обнаружите, что перенос некоторых вызовов OpenGL на C++ и использование буферов памяти, размещенных на C++, непосредственно для загрузки VBOs и т. Д. Также дает большой выигрыш в производительности.

4

Microsoft только что объявила о поддержке генерации векторизованных инструкций в своих .NET Native compiler благодаря встроенной оптимизации компилятора на C++ и, что более важно, встроенной поддержке типов векторов SIMD в самой последней версии их JIT («RyuJIT»). См. Некоторые samples here.

0

Если у вас настроение написать код сборки на C#, другой вариант - проект NAsmJit, который представляет собой порт AsmJit на C#. Я не обновил его, чтобы отразить последние изменения в этом проекте, но большая часть поддержки была вполне пригодна для использования при последней проверке.

1

Последние разработки в .NET включают в себя SIMD посвященный вектор/матрицу библиотеки под названием System.Numerics.Vector:

Using System.Numerics.Vector for Graphics Programming

Это будет включен, как только новый JIT-компилятор «RyuJIT» будет по умолчанию, предварительный просмотр здесь:

RyuJIT CTP5: Getting closer to shipping, and with better SIMD support

Так очень скоро (надеюсь, 2015), мы будем иметь очень быстрые векторы SIMD в .NET без каких-либо накладных расходов программирования.

Смежные вопросы