Использование SIMD в библиотеке CLR C ++

C #, Visual Basic и .NET CLR — отличные среды разработки для пользовательских интерфейсов, бизнес-приложений и т. Д.

Тем не менее, я писал много кода с таймингами выполнения O(n^3): n > 1000и в нескольких местах выше этого. По сути, эти циклы читают из одного большого массива, выполняют небольшую математику и выполняют пять или шесть тестов и записывают результат во второй массив идентичного размера.

Большая часть кода — это код, перенесенный из программ на Intel Fortran, чтобы перенести их в 64-битный мир. Я заметил, что без какой-либо автоматической векторизации этого кода время выполнения намного медленнее. .NET не поддерживает использование операций SIMD на всех процессорах Intel, проданных сегодня.

Поскольку функции уже написаны в строгом алгоритме, который может переносить опытный программист, я подумал, что попросить этого программиста перенести код в библиотеку C ++ CLR может быть подходом.

  • Можно ли получить библиотеку C ++, которая векторизована автоматически, а также представляет интерфейс CLR для вызова программы на C # / VB?
  • Если нет, существуют ли обходные пути? Является ли интерфейс COM одним из таких решений?
  • Если да, какую форму он должен принять?

1

Решение

Конечно, без проблем. Проект библиотеки классов C ++ / CLI дает вам возможность написать управляемую оболочку, реф класс, который может напрямую вызывать нативный код C ++. Такой класс может непосредственно использоваться любым управляемым кодом.

VS2012 или выше требуется для автоматической векторизации и распараллеливания в собственном коде C ++. Разработка уровня взаимодействия таким образом, чтобы минимизировать количество переходов от управляемого к неуправляемому коду и обратно, может быть важным. Другими словами, не копируйте ни одного двойной стоимость за раз.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]