Вызов кода SSE в управляемом коде (выравнивание) - PullRequest
7 голосов
/ 14 ноября 2011

Вот моя проблема: у нас есть математическая библиотека, написанная на C ++, которая интенсивно использует SSE. Нам нужно использовать ту же самую математическую библиотеку в нашем управляемом слое наших инструментов (которые написаны на C #).

Проблема в том, что классы математической библиотеки должны быть выровнены по 16 байтов (чтобы SSE работал). Однако при компиляции управляемого кода я получаю много ошибок, поскольку «__declspec (align (X))» не поддерживается.

Есть идеи, возможно ли это как-нибудь? Я не смог найти никакой полезной информации.

Некоторая дополнительная информация:

Математическая библиотека, написанная на C ++, использует SSE для максимальной производительности. Однако нашему инструменту не требуется максимальная производительность, мы можем даже снизить производительность по сравнению с общим кодом C #. Это больше о возможности фактически выполнить весь наш код (это огромная база кода), без необходимости людей конвертировать туда и обратно между типами данных.

Так что на самом деле речь идет только об удобстве использования, а не о производительности.

Я попробовал это: я поместил все наши математические функции в cpp вместо того, чтобы использовать их как встроенные функции. Теперь они экспортируются из собственной библиотеки DLL. Тем не менее, вектор-класс, конечно, все еще имеет закрытый член __m128 для своих данных.

Как только я поместил такую ​​переменную в управляемый код, компилятор сообщает мне, что мой управляемый код теперь является нативным кодом.

Значит ли это, что я не должен иметь такой тип в своем определении класса и полностью скрывать его за интерфейсом DLL? Спасибо.

Ответы [ 4 ]

5 голосов
/ 14 ноября 2011

Похоже, вы пытаетесь скомпилировать свою математическую библиотеку в управляемый код? Вместо этого вы должны оставить его в собственном коде и вызывать его напрямую из управляемого кода, используя P / Invoke .

Выделение требуемых структур из C # в собственный код с правильным выравниванием все еще будет сложным, но должно быть выполнимым.

Показанная работа здесь может быть полезна для понимания проблем.

Я вступаю на авантюрный путь, пытаясь ускорить Приложение для симуляции написано полностью на C # .NET с использованием SSE2. До сих пор Я провел несколько дней, рассматривая возможность использования SSE2 в Приложение .NET.

2 голосов
/ 14 ноября 2011

Может ли struct упаковка вам помочь?

http://www.developerfusion.com/article/84519/mastering-structs-in-c/

Вы можете использовать ее для выравнивания полей в определенных областях памяти.

1 голос
/ 19 ноября 2011

Ну, просто, чтобы обернуть вещи:

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

Таким образом, мы можем скомпилировать и связать все с помощью управляемого кода, но все же можем повысить нашу производительность, используя код SSE, где это действительно важно.

Однако получение чего-либо для компиляции с управляемым кодом, если компилятор может «видеть» материал SSE (например, у вас просто есть член __m128 в классе), является кошмаром. Вы должны положить много оберток вокруг всего.

Полагаю, это просто пример использования, с которым C # и управляемый код никогда не были совместимы.

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

0 голосов
/ 19 ноября 2011

Кстати, Оболочка fftw, которую я использую , вызывает методы fftw для выделения памяти, затем данные заполняются в управляемом коде, затем снова вызывается fftw для обработки. Можете ли вы использовать подобную парадигму?

...