2008-10-13 2 views
3

Я изучаю различные варианты сопоставления общих конструкций кода C# с кодом C++ CUDA для работы на графическом процессоре. Структура системы выглядит следующим образом (стрелки обозначают вызовы методов):Превращение методов C# в методы C++

C# программы -> C# GPU Lib -> C++ CUDA реализация Lib

Метод в библиотеке GPU может выглядеть примерно так:

public static void Map<T>(this ICollection<T> c, Func<T,T> f) 
{ 
    //Call 'f' on each element of 'c' 
} 

Это метод расширения для ICollection <> типы, которые выполняют функцию для каждого элемента. Однако, что я хотел бы сделать, это вызвать библиотеку C++ и заставить ее запускать методы на графическом процессоре. Это потребует, чтобы функция каким-то образом была переведена на C++-код. Это возможно?

Чтобы разработать, если пользователь моей библиотеки выполняет метод (в C#) с каким-либо произвольным кодом в нем, я хотел бы перевести этот код в эквивалент C++, чтобы я мог запускать его на CUDA. У меня такое ощущение, что нет простого способа сделать это, но я хотел бы знать, есть ли способ сделать это или добиться некоторого эффекта.

Одна вещь, о которой мне было интересно, - это захват функции для перевода в выражении и ее использование для сопоставления с эквивалентом C++. У кого-нибудь есть опыт?

ответ

7

Есть CUDA.Net, если вам нужна какая-то ссылка, как C# может работать на GPU.

+0

БОЛЬШАЯ ссылка, спасибо! – endian 2008-10-14 08:06:09

2

Если честно, я не уверен, что полностью понимаю, к чему вы клоните. Однако вы можете быть заинтересованы в этом проекте, который преобразует .Net-приложения/библиотеки в прямой C++ без какой-либо инфраструктуры .NET. http://www.codeplex.com/crossnet

0

Интересный вопрос. Я не очень эксперт в C#, но я думаю, что ICollection является контейнером объектов. Если бы каждый элемент c был, скажем, пикселем, вам нужно было бы сделать много маршаллинга, чтобы преобразовать его в буфер байтов или float, который CUDA мог использовать. Я подозреваю, что это замедлит все, чтобы свести на нет преимущество делать что-либо на gpu.

0

Что вы могли бы сделать, это написать собственный IQueryable LINQ provider, как это делается для LINQ to SQL, чтобы перевести запросы LINQ в SQL.

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

Возможно, стоит изучить, как реализовать MapReduce API Google для C# и CUDA, а затем использовать подход, подобный PyCuda, для отправки логики на GPU. В этом контексте также может быть полезно взглянуть на уже существующее MapReduce implementation in CUDA.

0

Это очень интересный вопрос, и я понятия не имею, как это сделать.

Однако Brahma library, похоже, делает что-то очень похожее. Вы можете определять функции с помощью LINQ, которые затем скомпилируются в шейдеры GLSL для эффективной работы на графическом процессоре. Посмотрите на их code и, в частности, образец Game of Life.

1

Я бы рекомендовал следующий процесс, чтобы ускорить некоторые из ваших вычислений с помощью CUDA из C# программы:

  • Во-первых, создать неуправляемого C++ библиотеки, которую P/Invoke для функций, которые вы хотите ускоряться. Это ограничит вас более или менее теми типами данных, с которыми вы можете легко работать в CUDA.
  • Интеграция вашей неуправляемой библиотеки с вашим приложением C#. Если вы делаете все правильно, вы уже должны заметить некоторую скорость. Если нет, вы, вероятно, должны отказаться.
  • Замените функции C++ внутри вашей библиотеки (без изменения интерфейса) для выполнения вычислений на графическом процессоре с ядрами CUDA.
Смежные вопросы