Использование SSE в C # это возможно? - PullRequest
14 голосов
/ 06 января 2009

Я читал вопрос об оптимизации кода на c #, и одним из решений было использование c ++ с SSE. Можно ли сделать SSE напрямую из программы на c #?

Ответы [ 9 ]

17 голосов
/ 06 января 2009

Предстоящий релиз Mono 2.2 будет иметь поддержку SIMD. Мигель де Иказа написал в блоге о предстоящей функции здесь , а API - здесь .

Хотя будет библиотека, которая будет поддерживать разработку под Microsoft .NET Windows Runtime, она не будет иметь тех преимуществ в производительности, которые вы ищете, если вы не запустите код в среде выполнения Mono. Что может быть выполнимо в зависимости от ваших обстоятельств.

Обновление: Mono 2.2 является выпущен

7 голосов
/ 06 января 2009

Может ли C # явно сделать вызов SSE?

Нет. C # не может создать встроенный IL, гораздо меньше встроенной сборки x86 / amd64.

CLR, а точнее JIT, будет использовать SSE, если он доступен, что устраняет необходимость его форсировать в большинстве случаев. Я говорю больше всего, потому что я не эксперт SSE, и я уверен, что есть случаи, когда это может быть полезным, и JIT не проводит оптимизацию.

5 голосов
/ 04 апреля 2014

SIMD для .NET будет доступен в ближайшее время. RyuJIT (JIT-компилятор следующего поколения для .NET), необходимый для этой функции ATM.

Вы должны использовать Microsoft.Numerics.Vectors.Vector<T> класс из пакета Microsoft.Bcl.Simd , чтобы воспользоваться этой функцией. Пример кода здесь .

4 голосов
/ 06 января 2009

Исходя из этой публикации на форуме, компилятор MS JIT автоматически использует SSE, если SSE доступен на целевой машине.

2 голосов
/ 19 сентября 2014
2 голосов
/ 19 апреля 2014

Недавно Microsoft выпустила бета-версию векторной библиотеки SIMD ( Microsoft.Bcl.Simd ) для C #, которая требует установки RyuJIT CTP и работает только для Windows 8.

Вы также можете просто использовать собственную библиотеку SSE и вызывать ее из C #. Например, библиотека Yeppp, см. этот ответ StackOverflow .

2 голосов
/ 15 июня 2011

Филипп прав. У меня есть другой, более старый пост, показывающий похожий, но более подробный пример. Я фактически запустил этот код и сам изменил его, чтобы доказать себе, что он работает. Я обдумываю использование этой техники в проекте, над которым я работаю, и поэтому я ищу то, что может быть новым, поскольку оно немного старое. Как предполагает автор, вы можете написать любую функцию на C ++, скомпилировать ее и скопировать байты в ваш C #.

http://blogs.msdn.com/b/devinj/archive/2005/07/12/438323.aspx

Я бы добавил, что класс CLI C ++ от Joe также является хорошей идеей, однако я не думаю, что флаг компилятора sse и флаг / clr совместимы в одном проекте. Я только что проверил, что: нужно написать свой код с высоким перфорированием в отдельном проекте, чтобы использовать флаг компилятора SSE (/ arch: sse или / arch: sse2), так как / clr несовместим. Я думаю, что это лучший подход для выполнения чего-либо гораздо более сложного, чем простая арифметика с несколькими входными данными.

2 голосов
/ 22 января 2009

Если у вас есть «кусок» работы, которую вы хотите выполнить, лучше всего написать ее на C ++ с использованием встроенных функций MMX / SSE, а затем создать очень простой / управляемый clr класс C ++, который оборачивает вашу функциональность и предоставляет ее как класс .net. Тогда ваш код может просто использовать эту сборку, как если бы это был обычный класс.

Для получения дополнительной информации о встроенных функциях VC вы можете взглянуть на эту маленькую заметку, которую я написал много лет назад.

http://msdn.microsoft.com/en-us/library/0aws1s9k.aspx

О - я предполагаю, что вы действительно хотите использовать параллельные функции для ускорения чего-либо. Как уже отмечали другие - если вы просто хотите перемещать данные большими кусками и т.п., JIT уже знает, как использовать SSE для этих основ.

1 голос
/ 06 января 2009

Конечно, вы можете (более важный вопрос - зачем вам? Просто оставьте это на время выполнения; это его работа).

C # позволяет сопоставить делегата с адресом памяти. Этот адрес памяти может содержать необработанные коды сборки. Вы можете прочитать больше в блоге Михаэля Гьянокаво .

Хотя я сам не пробовал, возможно, можно использовать Marshal.GetDelegateForFunctionPointer .

...