Превращение методов C # в методы C ++ - PullRequest
3 голосов
/ 13 октября 2008

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

Программа на C # -> Библиотека C # для графических процессоров -> Библиотека C ++ для реализации CUDA

Метод в библиотеке 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 ++ equivelant, чтобы я мог запустить его на CUDA. У меня такое ощущение, что не существует простого способа сделать это, но я хотел бы знать, есть ли способ сделать это или добиться какого-то такого же эффекта.

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

Ответы [ 6 ]

7 голосов
/ 13 октября 2008

* * * * * * * * * * * * * * * * * * * * * * * * * 1003 '* * * * * * * * * *

.
2 голосов
/ 13 октября 2008

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

1 голос
/ 10 июля 2009

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

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

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

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

0 голосов
/ 26 ноября 2008

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

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

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

0 голосов
/ 26 ноября 2008

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

...