Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Расширения языка С. Спецификаторы функций, спецификаторы переменных, добавленные типы



Расширения

Перед функциями в.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 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.006 с)...