CUDA Driver API срещу CUDA runtime

Когато пишете CUDA приложения, можете да работите на ниво драйвер или на ниво време за изпълнение, както е илюстрирано на това изображение (Библиотеките са CUFFT и CUBLAS за напреднали математика):

„CUDA
(източник: tomshw.it)

Предполагам, че компромисът между двете е повишена производителност за API от ниско ниво, но с цената на повишена сложност на кода. Какви са конкретните разлики и има ли съществени неща, които не можете да направите с API от високо ниво?

Използвам CUDA.net за взаимодействие с C# и той е изграден като копие на API на драйвера. Това насърчава писането на много доста сложен код на C#, докато еквивалентът на C++ би бил по-прост, като се използва API за изпълнение. Има ли нещо, което да спечелите, като го правите по този начин? Единственото предимство, което виждам, е, че е по-лесно да се интегрира интелигентна обработка на грешки с останалата част от C# кода.


person Morten Christiansen    schedule 28.10.2008    source източник
comment
едно предимство на API на драйвера би било за разработчиците на компилатори да добавят поддръжка за писане на ядра на езици, различни от CUDA подмножеството на C.   -  person Gautham Ganapathy    schedule 22.10.2009


Отговори (4)


CUDA runtime прави възможно компилирането и свързването на вашите CUDA ядра в изпълними файлове. Това означава, че не е нужно да разпространявате cubin файлове с вашето приложение или да се занимавате със зареждането им чрез API на драйвера. Както отбелязахте, като цяло е по-лесен за използване.

За разлика от това, API на драйвера е по-труден за програмиране, но предоставя повече контрол върху това как се използва CUDA. Програмистът трябва директно да се занимава с инициализация, зареждане на модули и т.н.

Очевидно по-подробна информация за устройството може да бъде поискана чрез API на драйвера, отколкото чрез API по време на изпълнение. Например, наличната свободна памет на устройството може да бъде заявена само чрез API на драйвера.

От ръководството на програмиста на CUDA:

Състои се от два API:

  • API от ниско ниво, наречен API на CUDA драйвер,
  • API от по-високо ниво, наречен API за изпълнение на CUDA, който е внедрен върху API на драйвера CUDA.

Тези API са взаимно изключващи се: приложението трябва да използва или едното, или другото.

Средата за изпълнение на CUDA улеснява управлението на кода на устройството, като предоставя имплицитна инициализация, управление на контекста и управление на модули. Кодът на C хост, генериран от nvcc, е базиран на времето за изпълнение на CUDA (вижте раздел 4.2.5), така че приложенията, които се свързват към този код, трябва да използват API за изпълнение на CUDA.

За разлика от това, API на драйвера CUDA изисква повече код, по-труден е за програмиране и отстраняване на грешки, но предлага по-добро ниво на контрол и е независим от езика, тъй като се занимава само с cubin обекти (вижте раздел 4.2.5). По-специално, по-трудно е да се конфигурират и стартират ядра с помощта на API на драйвера CUDA, тъй като конфигурацията за изпълнение и параметрите на ядрото трябва да бъдат посочени с изрични извиквания на функции вместо синтаксиса за конфигурация на изпълнение, описан в раздел 4.2.3. Също така, емулацията на устройство (вижте раздел 4.5.2.9) не работи с API на CUDA драйвера.

Няма забележима разлика в производителността между API. Как вашите ядра използват паметта и как са разположени върху графичния процесор (в изкривявания и блокове) ще има много по-изразен ефект.

person mch    schedule 31.10.2008
comment
Това цитат ли е? Ако е така, не мога да го намеря. Бихте ли посочили точното име на документа и главата, в която се намира това? - person dialer; 16.06.2012
comment
These APIs are mutually exclusive: с по-новите версии на CUDA това вече не е вярно. Сега в документацията се посочва An application can mix runtime API code with driver API code. Също cfr. stackoverflow.com/a/27014990/1938163 - person Marco A.; 19.11.2014
comment
@dialer Намерих това, но е много старо slideshare.net/PedramMazloom/nvidia-cuda-programmingguide10 - person Mike Vella; 06.06.2018

Открих, че за внедряване на библиотеки в многонишкови приложения, контролът върху контекста на CUDA, предоставен от API на драйвера, е критичен. Повечето от моите клиенти искат да интегрират GPU ускорение в съществуващи приложения, а в наши дни почти всички приложения са многонишкови. Тъй като не можех да гарантирам, че целият GPU код ще бъде инициализиран, изпълнен и освободен от една и съща нишка, трябваше да използвам API на драйвера.

Първоначалните ми опити с различни заобиколни решения в API по време на изпълнение доведоха до провал, понякога по грандиозен начин - открих, че мога многократно, мигновено да рестартирам машина, като изпълнявам само грешен набор от CUDA извиквания от различни нишки.

Откакто мигрирахме всичко през API на драйвера, всичко беше наред.

J

person Jason Dale    schedule 25.03.2010
comment
Можете ли да разработите повече или да направите връзка към някъде, обяснявайки как използването на драйвера директно ви помага да контролирате времето на тези различни задачи? - person einpoklum; 02.02.2016
comment
@einpoklum Трябва да създадете контекст, за да извършвате повиквания, така че имате възможност напр. отделяне на по една на нишка, вместо да се налага да предоставя гаранции по време на изпълнение, че грешна нишка действа върху имплицитно споделения контекст на API за изпълнение - person mabraham; 28.05.2018
comment
@mabraham: Значи по същество става въпрос за нишка срещу споделени CUDA контексти? - person einpoklum; 29.05.2018
comment
@einpoklum Да, API по време на изпълнение има имплицитен контекст, който се споделя от всички нишки. API на драйвера позволява повече гъвкавост. - person mabraham; 29.05.2018

няколко важни неща, които трябва да отбележите:

първо, разликите между API се отнасят само за кода от страната на хоста. Ядрата са абсолютно еднакви. от страната на хоста сложността на API на драйвера е доста тривиална, основните разлики са:

в api на драйвера имате достъп до функционалност, която не е налична в контексти, подобни на api по време на изпълнение.

емулаторът работи само с код, написан за API по време на изпълнение.

о, и в момента cudpp, която е много удобна библиотека, работи само с API по време на изпълнение.

person Community    schedule 01.03.2009

Има някои реални проблеми с подравняването на аргументите и API на драйвера. Вижте документацията за CUDA 2.2 beta (или по-нова) за повече информация.

person Community    schedule 20.03.2009
comment
Така ли е и днес? - person einpoklum; 02.02.2016