среда, 7 ноября 2012 г.

CUDA.NET Пример реализации

4 июля 2008 г. вышла версия 1.1 alpha CUDA.NET. Работала она только под WinXP и поддерживала CUDA версии 1.1. С 2008 г. проект стал динамично развиваться и на данный момент актуальный релиз - v 3.0.0 (Download). Этого пакета в полне достаточно для изучения CUDA и создания приложений на её основе. Пример использования: программа для конвертации музыки FLAC. CUDA - объектно-ориентированная обёртка для использования API, предоставляемых драйвером.



Пример:

В примере мы создадим небольшую утилиту, которая будет отображать сведения о CUDA-совместимых устройствах.

1 Создание
Создадим проект в VS C# новый проект - консольное приложение и сошлёмся на сборку CUDA.NET:
Взаимодействие с API драйвера CUDA - это класс GASS.CUDA.CUDA.

2 Класс
Создадим объект класса GASS.CUDA.CUDA:
CUDA cuda = new CUDA(true);
Параметр true конструктора позволяет инициализировать драйвер CUDA.

3 Инициализация
Инициализация драйвера:
Console.WriteLine();
Console.WriteLine( "Список CUDA-оборудования:" );
Console.WriteLine();
var devices = cuda.Devices;
Console.WriteLine( "Количество устройств: " + devices.Count() );
Console.WriteLine();
foreach ( var dev in devices )
{
  Console.WriteLine( "Название чипа видеоадаптера: " + dev.Name );
  Console.WriteLine( "Объём доступной видеопамяти: {0}Кб", dev.TotalMemory / 1024 );
  Console.WriteLine( "CUDA Compute Capability: " + dev.ComputeCapability );
  Console.WriteLine();
  Console.WriteLine( "Расширенные свойства:" );
  var props = dev.Properties;
  Console.WriteLine( "\tЧастота работы шейдерного домена: {0}МГц", props.ClockRate / 1000 );
  Console.WriteLine( "\tМаксимальное число нитей в блоке: " + props.MaxThreadsPerBlock );
  Console.WriteLine( "\tРегистров в мультипроцессоре: {0} шт.", props.RegistersPerBlock );
  Console.WriteLine( "\tОбъём общей памяти в мультипроцессоре: {0} байт(а)", props.SharedMemoryPerBlock );
  Console.WriteLine( "\tРазмер варпа: " + props.SIMDWidth );

  Console.WriteLine();
  Console.WriteLine( "Нажмите ENTER..." );
  Console.ReadLine();
}
}
catch ( CUDAException ex )
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine( "CUDAException" );
Console.WriteLine( ex.Message );
}

4 Суть
Мы обращаемся к коллекции описания устройств и выводим информацию о каждом из них. В примере отображается не вся доступная API информация. Получится нечто подобное: