Пользователь
0,0
рейтинг
13 марта 2009 в 13:34

Разработка → CUDA: Начало


Это первая публикация из цикла статей об использовании GPGPU и nVidia CUDA. Планирую писать не очень объемно, чтобы не слишком утомлять читателей, но достаточно часто.

Я предполагаю, что читатель осведомлен, что такое CUDA, если нет, то вводную статью можно найти на Хабре.

Что потребуется для работы:


1. Видеокарта из серии nVidia GeForce 8xxx/9xxx или более современная
2. CUDA Toolkit v.2.1 (скачать можно здесь: www.nvidia.ru/object/cuda_get_ru.html)
3. CUDA SDK v.2.1 (скачать можно там же где Toolkit)
4. Visual Studio 2008
5. CUDA Visual Studio Wizard (скачать можно здесь: sourceforge.net/projects/cudavswizard)

Создание CUDA проекта:


После установки всего необходимого в VS появиться новый вид проекта для С++ с названием CU-DA WinApp, это именно то, что нам надо. В данном типе проекта доступны дополнительные на-стройки для CUDA, позволяющие настроить параметры компиляции под GPU, например версию Compute Capability в зависимости от типа GPU и т.д.
Обычно я создаю чистый проект (Empty Project), так как Precompiled Headers навряд ли пригодиться для CUDA.
Важно отметить, как собирается CUDA приложение. Файлы с расширением *.cpp обрабатываются компилятором MS C++ (cl.exe), а файлы c расширением *.cu компилятором CUDA (nvcc.exe), который в свою очередь определяет, какой код будет работать на GPU, а какой на CPU. Код из *.cu, работающий на CPU, передается на компиляцию MS C++, эту особенность удобно использовать для написания динамических библиотек, которые будут экспортировать функции, использующие для расчетов GPU.
Далее привожу листинг простой программы на CUDA, который выводит на экран информацию об аппаратных возможностях GPU.

Листинг. Программа CudaInfo.

//FileName: cudaInfo.cu

#include <stdio.h>
#include <cuda_runtime_api.h>

int main()
{
  int deviceCount;
  cudaDeviceProp deviceProp;

  //Сколько устройств CUDA установлено на PC.
  cudaGetDeviceCount(&deviceCount);

  printf("Device count: %d\n\n", deviceCount);

  for (int i = 0; i < deviceCount; i++)
  {
    //Получаем информацию об устройстве
    cudaGetDeviceProperties(&deviceProp, i);

    //Выводим иформацию об устройстве
    printf("Device name: %s\n", deviceProp.name);
    printf("Total global memory: %d\n", deviceProp.totalGlobalMem);
    printf("Shared memory per block: %d\n", deviceProp.sharedMemPerBlock);
    printf("Registers per block: %d\n", deviceProp.regsPerBlock);
    printf("Warp size: %d\n", deviceProp.warpSize);
    printf("Memory pitch: %d\n", deviceProp.memPitch);
    printf("Max threads per block: %d\n", deviceProp.maxThreadsPerBlock);
    
    printf("Max threads dimensions: x = %d, y = %d, z = %d\n",
      deviceProp.maxThreadsDim[0],
      deviceProp.maxThreadsDim[1],
      deviceProp.maxThreadsDim[2]);
    
    printf("Max grid size: x = %d, y = %d, z = %d\n",
      deviceProp.maxGridSize[0],
      deviceProp.maxGridSize[1],
      deviceProp.maxGridSize[2]);

    printf("Clock rate: %d\n", deviceProp.clockRate);
    printf("Total constant memory: %d\n", deviceProp.totalConstMem);
    printf("Compute capability: %d.%d\n", deviceProp.major, deviceProp.minor);
    printf("Texture alignment: %d\n", deviceProp.textureAlignment);
    printf("Device overlap: %d\n", deviceProp.deviceOverlap);
    printf("Multiprocessor count: %d\n", deviceProp.multiProcessorCount);

    printf("Kernel execution timeout enabled: %s\n",
      deviceProp.kernelExecTimeoutEnabled ? "true" : "false");
  }

  return 0;
}

* This source code was highlighted with Source Code Highlighter.


В программе я подключаю библиотеку “cuda_runtime_api.h”. Хотя это делать не обязательно, так она инклюдится автоматически, но без неё не будет работать IntelliSence (хотя все равно периодически косячит).

Заключение


Я думаю, что это самый простой способ для написания CUDA-программ, так как требуется минимум усилий для конфигурирования и настройки среды, единственная проблема только с использованием IntelliSence.
В следующий раз будет рассмотрено использование CUDA для математических вычислений и вопросы работы с память видеокарты.

P.S. Задавайте вопросы.
Max K. @MaxFX
карма
40,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (62)

  • +2
    Очень интересная для меня тема! Жду следующих публикаций. Особенно была бы интересна тема оптимизации работы с памятью видеокарты, параллельные вычисления, многопоточность.
  • 0
    Раз уж на то пошло… Переносите топик в свежесозданный профильный блог habrahabr.ru/blogs/CUDA/
    • +1
      ок.
    • –1
      Может правильнее объеденить всю инфу по вычислениям на GPGPU от NVidia и ATI в один блог — OpenCL:

      • 0
        ^^ Это был вопрос :)
        OpenCL — ru.wikipedia.org/wiki/OpenCL
        • 0
          Тогда уж GPGPU
          • 0
            GPGPU — это «процессор», а вычисления на «процессоре» — OpenCL
  • +4
    Такими интересными статьями нас не утомишь, пишите больше.
    Все с радостью почитают.
  • +2
    Спасибо за ссылку на CUDA Visual Studio Wizard.

  • +1
    Cuda — это очень хорошо!
    Вот только если бы все вместе договорились об «едином стандарте», а то получается для nVidia отдельно, для AMD и Intel — отдельно «писать».
    Я понимаю nVidia — её надо продвигать то, что они купили и рассказывать инвесторам куда они девают деньги. Но извините, писать под каждую систему свой код — накладно и трудоёмко.
    Все же Intel и AMD пошли по другой дороге (Havoc) ;)
    Может nVidia, лучше купить VIA с их лицензией на x86, а потом сделать процессор и выработать единый с Intel, AMD стандарт, тогда не будет войн и программеры будут писать не узко-заточенные программы. Или договориться с Microsoft, чтобы CUDA включили в DirectX :)
    • +1
      P.S. А так получается не CUDA, а КУДА? Куда идти программистам :)
    • 0
      В принципе, CUDA — низкоуровневый программно-аппаратный стек для программирования GPU. В документации у NVidia есть небольшая схема по которой: OpenCL и Compute Shaders из DX11 работают поверх CUDA-стека. Просто железа что-то не видно с поддержкой этих технологий, а CUDA уже на рынке больше 3 лет.
      Я хотел DX11 SDK Beta качнуть, чтобы глянуть на Compute Shaders, а там в загрузке уже написано, что пока это чудо работает только в режиме эмуляции и надо ждать соответствующее железо.
      • 0
        Я всегда говорил, только общие стандарты будут будут «двигать» хорошие технологии.
        nVidia надо сосредоточиться на продвижении стандартов.
        Не знаю, на мой взгляд nVidia действует как то «однобоко». А продвигает, «жестоко». Наказывает железячные сайты, которые не упоминают о cuda. %( (habr-y теперь это не грозит :)
        Как-то не «по-людски».
        • 0
          По поводу общих стандартов я не совсем согласен. В свое время много работал с OpenGL и думал, что это лучшее API для 3D графики (кросплатформенное, открытое и т.д). Слышал много недовольств в сторону DirectX, мол не совместим даже между новыми версиями, использует кривую COM модель программирования и вообще закрытый, до кучи еще и тормозной. Отношение у меня к DX после этого было подпорчено, но когда взял DX SDK и попробовал в действии этот «плохой» DX, то отношение резко изменилось на противоположенное. После DX на OpenGL возвращаться навряд ли буду. Все беда, что при принятии этих самых стандартов каждый тянет одеяло на себя и это длиться по несколько лет. К примеру — OpenGL 3.0, я бы сказал максимум 2.1, но не как не 3, а сколько перед этим было шуму.
          • 0
            Лично мое мнение, прошу не минусовать.
          • 0
            DirectX — фактически стандарт для win приложений :)
            Я тоже начинал с OpenGL, но DirecX мне больше понравился :) Правда это было 8 лет назад :)))
    • 0
      зачем куда в директХ? как быть с линуксом?
    • 0
      Подождите чуть-чуть, эппл принесет нам счастье en.wikipedia.org/wiki/OpenCL
    • 0
      Единые стандарты в таком бизнесе практически невозможны. А если что-то и будет — то сродни микрореволюции.
  • 0
    Я правильно понимаю, что VS2008 платный и надо брать VS2005?
    • 0
      Или VS 2008 express тоже бесплатен?
      • 0
        Да
    • 0
      Я рабоатю в VS2008 — никаких проблем. Можно использовать VS2008 Express Edition.
    • 0
      если есть айсик (международный студ билет) то можно нахаляву получить НЕ дев експрес
  • +4
    а как правильно читать название CUDA, «куда» или «cюда»? :)
    • 0
      наверное
      СиЙуДиЭй
    • 0
      Предположительно, CUDA пошло от слова «barracuda», а расшифровка появилась позже. Соответственно и произносить стоит как «кудэ».
      • 0
        Совершенно точно что CUDA — это Compute Unified Device Architecture :)
    • 0
      Люди из NVIDIA в России говорят кУда
  • 0
    спасибо
    подписался на блог, жду с нетерпением новых статей
  • 0
    Спасибо! Очень интересно!
  • 0
    Кто бы про Brook+ написал нечто подобное…
    А то очень хочется попробовать, а ничего на очень новичковом уровне не нашёл :(
    • 0
      Как напишу свою работу на нём, постараюсь рассказать. Боюсь показаться нудным, но там вполне понятная документация и примеры.
      • 0
        А что за работа?
        Хочется совсем на «тупом» уровне :)
        • 0
          В области кодирования видео. Ну уж как получится. Главное вообще взяться за статью.
          • 0
            Было бы здорово! Буду ждать :) Успехов вам.
      • 0
        А Вы на кого если не секрет работаете? =)
        • 0
          Это вы меня спрашиваете? :) На большого дядю, который вытачивает из кремния очень производительные кусочки :)
  • 0
    Вот бы еще тоже самое только для Eclipse
  • НЛО прилетело и опубликовало эту надпись здесь
  • +1
    Я вот не очень осведомлен. Подобные СДК есть для языков кроме C?
  • 0
    я жду приличный бесплатный HD-кодер для видео написанный с использованием CUDA, а так почитать будет интересно
    только скажите мне, в качестве VisualStudio подойдёт Express-версия???
    • 0
      Должно работать. Разве CUDA Visual Studio Wizard может косячить, сам не пробовал. В крайнем случае можно пример проекта из CUDA взять и сделать свой шаблон.
      • 0
        ок, буду пробовать
        • 0
          Есть транскодер Badaboom. Там используется hardware acceleration.
          • 0
            ключевое слово — бесплатный, а Бадабум стоит денег, причём немалых
            • 0
              Бадабум отстойный кодер. В сети лежат данные о сравнении его с альтернативами, и видно что по качеству он сливает.
    • 0
      всмысле H.264?
      • 0
        в смысле да
        • 0
          Этим занимаются (я в частности)
          • 0
            жду )))
          • 0
            Хмм… Я тоже этим занимаюсь :)
            • 0
              Вот я и интересуюсь на _какого_ дядю Вы работаете, а Ваш предыдущий ответ не содержал ответа на мой вопрос ;)
              • 0
                Может мы с вами в одной команде работаем? ;)
                • 0
                  Это вряд ли, но если Вас смущает выяснение таких подробностей на публике — мы можем переместиться в PM. Ведь Ваш работодатель — это не секрет, надеюсь? =)
                  • 0
                    Нет конечно. Спрашивайте, в личку.
  • 0
    Ооо, спасибо за статью. Распределенные вычисления были моей курсовой, когда я еще учился.
  • 0
    А кроссплатформенные решения есть?
    • 0
      В принципе сам пакет CUDA Toolkit и CUDA SDK есть под Mac и Linux
  • 0
    Да и в принципе не лишне было бы дать пару tip'ов по настройке IDE. Как по мне так ценность такого рода статей это именно системное описание немного разрозненых вещей (ide, компилятора, доп утилит и т.п.), что позволяет меньше гуглить, и не забивать мозги всяким попутным хламом.
  • 0
    Занимательное видео от разроботчиков Microsoft —
    «Семен Козлов про вычисления на графических картах»:
    blogs.msdn.com/mikcher/archive/2009/02/25/channel-9-1.aspx
    blogs.msdn.com/mikcher/archive/2009/03/01/channel-9-2.aspx
    blogs.msdn.com/mikcher/archive/2009/03/04/channel-9-3.aspx

    Просмотрев эти ролики, скачал VS, CUDA SDK и сам потрогал это дело. N-Body Simulation просто фантастика. Ощутил какие большие вычислительные мощности у нас простаивают, когда мы не играемся в игрушки.

    Кстати, в распределенных вычислительных сетях (например boinc.berkeley.edu/) огромную часть вычислений (на порядок больше чем CPU) делают GPU nVidia с CUDA.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.