Выполнение инструкций CPU/GPU из управляемого кода
Принимая во внимание бит отключения выполнения, каков рекомендуемый способ выполнения инструкций для собственного процессора из высокоуровневой управляемой среды, такой как VB.NET 2008 или C#. Кроме того, кто-нибудь достиг аналогичного в выполнении инструкций GPU против графического процессора?
3 ответа
Существует несколько вариантов графического процессора для C# для прямого доступа без возврата к P/Invoke или написания ваших собственных оболочек C++:
- Брахма довольно интересный. Он обеспечивает доступ к графическому процессору напрямую через специализированного поставщика LINQ. Код включает в себя несколько примеров высоко вычислительных методов, запускаемых на GPU, все они написаны на C# через LINQ.
- SlimDX обеспечивает хорошую оболочку.NET для всех основных функций DirectX. С помощью пользовательских шейдеров вы можете выполнять вычисления на GPU через DirectX. Он также включает поддержку DX11, поэтому вы можете напрямую использовать вычислительные шейдеры (если у вас есть оборудование для этого).
- Вы можете получить доступ к CUDA через CUDA.NET.
- Вы можете использовать OpenCL через OpenCL.NET.
Что касается инструкций ЦП, для этого обычно требуется сброс на собственный уровень более низкого уровня с инструкцией на ассемблере. Вероятно, наиболее интересным полностью управляемым (по крайней мере частично связанным) вариантом будет использование Mono.Simd, который обеспечивает прямой доступ к инструкциям SIMD в ЦП из управляемого кода при работе в стеке Mono.
Это не вариант. Вам потребуется P/Invoke для функции в DLL, которая была сгенерирована MASM или написана на неуправляемом C/C++ с использованием встроенной сборки или встроенных функций. Или используйте компилятор C++/CLI и генерируйте код смешанного режима с управлением #pragma.
Помните, что теперь вы больше не можете зависеть от JIT-компилятора, генерирующего любой код платформы, подходящий для операционной системы. Используйте Project + Properties, вкладку Build, Platform Target, чтобы заставить архитектуру соответствовать вашему неуправляемому коду.
Посмотрите на CUDA для управляемого кода GPU.
Создайте неуправляемую библиотеку.dll с любыми инструкциями и используйте P/Invoke для ее вызова.