Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Расширения
Перед функциями в.cu файле могут стоять следующие «модификаторы»:
· __device__ — это означает, что функция выполняется только на видеокарте. Из программы выполняющейся на обычном процессоре(host) её вызвать нельзя.
· __global__ — Эта функция — начало вашего вычислительного ядра. Выполняется на видеокарте, но запускается только с хоста.
· __host__ — Выполняется и запускается только с хоста (т.е. обычная функция C++). Если вы перед функцией укажите например __host__ и __device__ — то будут скомпилированы 2 версии функции (не все комбинации допустимы).
Спецификаторы размещения переменных в памяти GPU:
1. __device__ - переменная помещается в глобальной памяти устройства, например:
__device__ float a;
2. __constant__ - переменная располагается в константной памяти. Записывать значение можно только с CPU, с помощью функции cudaMemcpyToSymbol();
3. __shared__ - переменная помещается в разделяемую память. Нельзя при объявлении переменной инициализировать её.
Добавленные типы:
1. 1,2,3,4-мерные векторы, построенные из базовых типов. Например: char1, char2, char3, char4, int#, uint#, float#
2. Для задания размерности используется тип dim3, построенный на основе uint3 с конструктором, инициализирующим незаданные поля единицами.
Добавленные переменные:
1. dim3 gridDim – размер грида
2. dim3 blockDim – размер блока
3. uint3 blockIdx – индекс текущего блока в гриде
4. uint3 threadIdx – индекс текущего потока в блоке
5. int warpSize – размер варпа.
Для получения технической информации об имеющихся в компьютере адаптерах предлагается использовать Си-функцию CUDA API cudaGetDeviceProperties:
· maxGridSize – размерность сетки блоков. К примеру, на GeForce 9600M GS размерность сетки блоков: 65535*65535*1, то есть сетка блоков двумерная (полученные данные удовлетворяют Compute Capability v.1.1).
· maxThreadsDim – размерность массива нитей в блоке.
Типичный, но не обязательный шаблон решения задач:
· задача разбивается на подзадачи;
· входные данные делятся на блоки, которые вмещаются в разделяемую память;
· каждый блок обрабатывается блоком потоков;
· подблок подгружается в разделяемую память из глобальной;
· над данными в разделяемой памяти проводятся соответствующие вычисления;
· результаты копируются из разделяемой памяти обратно в глобальную.
4. Функции 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 - размер выделяемой памяти в байтах
2. Функция освобождения памяти на устройстве:
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
Дата публикования: 2015-02-03; Прочитано: 418 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!