Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otvety_ekzamen_Chernysheva.docx
Скачиваний:
7
Добавлен:
01.05.2025
Размер:
648.58 Кб
Скачать
  1. Расширения языка с. Спецификаторы функций, спецификаторы переменных, добавленные типы.

Расширения

Перед функциями в .cu файле могут стоять следующие «модификаторы»:

    • __device__ — это означает, что функция выполняется только на видеокарте. Из программы выполняющейся на обычном процессоре(host) её вызвать нельзя.

    • __global__ — Эта функция — начало вашего вычислительного ядра. Выполняется на видеокарте, но запускается только с хоста. 

    • __host__ — Выполняется и запускается только с хоста (т.е. обычная функция C++). Если вы перед функцией укажите например __host__ и __device__ — то будут скомпилированы 2 версии функции (не все комбинации допустимы). 

Спецификаторы размещения переменных в памяти GPU:

  1. __device__ - переменная помещается в глобальной памяти устройства, например: __device__ float a;

  1. __constant__ - переменная располагается в константной памяти. Записывать значение можно только с CPU, с помощью функции cudaMemcpyToSymbol();

  2. __shared__ - переменная помещается в разделяемую память. Нельзя при объявлении переменной инициализировать её.

Добавленные типы:

  1. 1,2,3,4-мерные векторы, построенные из базовых типов. Например: char1, char2, char3, char4, int#, uint#, float#

  1. Для задания размерности используется тип dim3, построенный на основе uint3 с конструктором, инициализирующим незаданные поля единицами.

Добавленные переменные:

  1. dim3 gridDim – размер грида

  1. dim3 blockDim – размер блока

  2. uint3 blockIdx – индекс текущего блока в гриде

  3. uint3 threadIdx – индекс текущего потока в блоке

  4. int warpSize – размер варпа.

Для получения технической информации об имеющихся в компьютере адаптерах предлагается использовать Си-функцию CUDA API cudaGetDeviceProperties:

    • maxGridSize – размерность сетки блоков. К примеру, на GeForce 9600M GS размерность сетки блоков: 65535*65535*1, то есть сетка блоков двумерная (полученные данные удовлетворяют Compute Capability v.1.1).

    • maxThreadsDim – размерность массива нитей в блоке.

Типичный, но не обязательный шаблон решения задач:

    • задача разбивается на подзадачи;

    • входные данные делятся на блоки, которые вмещаются в разделяемую память;

    • каждый блок обрабатывается блоком потоков;

    • подблок подгружается в разделяемую память из глобальной;

    • над данными в разделяемой памяти проводятся соответствующие вычисления;

    • результаты копируются из разделяемой памяти обратно в глобальную.

  1. Функции cuda: функция вызова ядра, функции работы с памятью.

Каждая функция CUDA, кроме вызова ядра, возвращает переменную типа cudaError_t. В случае удачного завершения равна cudasuccess, иначе коду ошибки.

Функция вызова ядра:

__global__ void Kernel<<<dim3 grdim, dim3 bldim, size_t Ns, cudaStream_t S>>>(arg);

    • dim3 grdim - размер грида в блоках

    • dim3 bldim - размер блока в потоках

    • size_t Ns - размер дополнительно выделяемой shared памяти к уже имеющейся

    • cudaStream_t S - номер потока, в котором будет происходить вызов функции, по умолчанию номер потока равен 0.

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

    • arg - аргументы функции, выполняемой на устройстве.

Функция Kernel вызывается на хосте.

Функция работы с памятью

Для выделения и освобождения памяти на GPU используются функции:

  1. cudaMalloc() cudaFree()

Функция выделения памяти:

cudaError_t cudaMalloc((void**)&devPtr,int size);

где

    • (void**)&devPtr - адрес переменной или массива, для которой выделяется память на устройстве

    • int size - размер выделяемой памяти в байтах

  1. Функция освобождения памяти на устройстве:

cudaError_t cudaFree(devPtr);

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

Функция синхронизации

cudaError_t __syncthreads();

При обращении к данной функции все нити будут ждать до тех пор, пока все нити блока необратятся к этой функции, после этого действие ее прекращается.

Функция копирования памяти

Функция malloc выделяет память на GPU, к которой CPU не имеет непосредственного отношения.

Функция cudaMemcpy позволяет копировать память с CPU на GPU и обратно и внутри GPU.

cudaError_t cudaMemcpy(void *dst, const void *src, size_t size, enum cudaMemcpyKind kind);

    • void *dst - адрес куда необходимо скопировать память

    • const void *src - адрес откуда необходимо скопировать память

    • size_t size - объем переписываемой памяти в байтах

    • enum cudaMemcpyKind kind - задает способ записи памяти, может принимать следующие значения:

      • cudaMemcpyHostToHost

      • cudaMemcpyHostToDevice

      • cudaMemcpyDeviceToHost

      • cudaMemcpyDeviceToDevice

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]