Использование SSE в c # возможно ли это?

StackOverflow https://stackoverflow.com/questions/415375

  •  03-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

Предстоящий Mono 2.2 будет иметь поддержку SIMD. Мигель де Иказа написал в блоге о новой функции здесь , а API - < a href = "http://go-mono.com/docs/index.aspx?tlink=0@N%3aMono.Simd" rel = "noreferrer"> здесь .

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

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

Другие советы

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

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

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

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

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

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

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

Чтобы узнать больше об особенностях VC, вы можете взглянуть на эту маленькую заметку, которую я написал много лет назад.

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

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

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

http://blogs.msdn.com/ б / devinj / архив / 2005/07/12 / 438323.aspx

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top