Вызов ядра

Опубликовано марта 5, 2018 в Технология CUDA

Сейчас на основе предыдущего примера мы напишем код, который уже не так напоминает простенькую программу «Здравствуй, мир!».

В этой программе есть два добавления к первоначальному примеру:

  • пустая функция kernel () с квалификатором _ _global_ _;
  • вызов этой пустой функции, украшенный синтаксисом <«1,1»>.

CUDA

В предыдущем разделе данной категории, мы видели, что по умолчанию код обрабатывается стандартным компилятором С. Так, в Linux код для CPU будет компилировать GNU gcc, а в Windows — Microsoft Visual С. Инструментальные средства NVIDIA просто передают код компилятору для CPU, и все работает так, будто никакой CUDA в мире не существует.

Теперь же мы видим, что CUDA С дополняет стандартный язык С квалификатором _ _global_ _. Тем самым мы говорим компилятору, что эта функция должна компилироваться для исполнения устройством, а не CPU. В данном случае nvcc передает функцию kernel () компилятору, обрабатывающему код для устройства, а функцию main () — компилятору для CPU, как в предыдущем примере.

Но что это за таинственное обращение к kernel () и почему мы должны уродовать стандартный синтаксис С угловыми скобками и набором чисел? Готовьтесь, именно здесь и творится волшебство.

Мы видели, что CUDA С нуждается в каком-то синтаксическом способе пометить, что функция должна исполняться устройством. Ничего особенного тут нет; это просто признак, позволяющий отправлять код для CPU одному компилятору, а код для устройства — другому. Настоящий трюк в том, чтобы вызвать код для устройства из кода, исполняемого CPU. Одно из достоинств CUDA С заключается в том, что он обеспечивает языковую интеграцию, благодаря которой вызовы функций для устройства выглядят очень похоже на вызовы функций для CPU. Позже мы обсудим, что реально происходит за кулисами, а пока достаточно знать, что компилятор и исполняющая среда CUDA берут на себя заботу о вызове кода для устройства из программы, исполняемой CPU.

Итак, странный вызов служит для обращения к коду, исполняемому устройством, но к чему все-таки эти угловые скобки и числа? Угловыми скобками обозначаются аргументы, которые мы собираемся передать исполняющей среде. Это не аргументы функции, исполняемой устройством, а параметры, влияющие на то, как исполняющая среда будет запускать код для устройства. Разговор об этих параметрах мы отложим до следующей главы. Аргументы же самой функции передаются в круглых скобках — как обычно.