Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекция2 - 2015

.pdf
Скачиваний:
14
Добавлен:
03.05.2015
Размер:
1.07 Mб
Скачать

Примеры исходного кода

#include "../src/ErrorControlled.h" #include "../src/Rational.h" #include "../src/Fractions.h"

void main(){

float d_f=30031.f/30029.f;

float res_f=1/(1/d_f-15014.f/15015.f);

ErrorControlled d_ecc=ErrorControlled(30031.)/ErrorControlled(30029.); ErrorControlled res_ecc=1/(1/d_ecc-ErrorControlled(15014.)/ErrorControlled(15015)); cout<<d_f<<" "<<d_ecc<<"\n";

}

#include <stdio.h>

#include "src/num/errorcontrolled.h" #include "src/geom/convex_giftwrap.h"

typedef ErrorControlled Num;

//если задать typedef double Num; то вычисления будут производиться в формате с плавающей запятой

void main(){

SPointSet<Num> point_set; point_set.n=10000;

point_set.points=new SPoint<Num>[point_set.n]; const int max_mod=1024;

for(unsigned i=0;i<point_set.n;i++) point_set.points[i].SetCoord();

SChain<Num> chain;

 

CalcConvexHull(point_set,chain);

 

delete[] chain.Indexes;

11

delete[] point_set.points;

 

}

 

Свойства рассмотренных типов вычислений

Тип вычислений

Точное

Исключение

 

представлени

вычислительных

 

е результатов

аномалий

 

 

 

Вычисления с исключением

+

+

ошибок округления

 

 

 

 

 

Вычисления с ослаблением

-

+

влияния ошибок округления

 

 

 

 

 

Вычисления с

-

только обнаружение

автовалидацией

 

 

 

 

 

Вычисления с плавающей

-

-

запятой

 

 

 

 

 

12

Ресурсы

Exact Geometric Computation Group (EGC group) http://www.cs.nyu.edu/exact/

Computational Geometry Algorithms Library (CGAL) http://www.cgal.org/

LEDA library http://www.algorithmicsolutions.com/leda/

13

Архитектурные особенности GPU

Свойство

многоядерные CPU

GPU

 

 

 

количество исполнительных

1…8

32…512

устройств

 

 

 

 

 

количество активных потоков

около 20 на ядро

≥512

 

 

 

распределение потоков

программное

аппаратное

 

 

 

затраты на переключение и

высокие

низкие

синхронизацию потоков

 

 

 

 

 

возможность управления

 

 

ресурсами из выполняемой

есть

нет

программы

 

 

 

 

 

организация

MIMD

SIMD

 

 

 

необходимость согласованного выполнения потоков

невозможность управления выделением памяти из программы, выполняющейся на GPU

необходимость выполнения большого количества нитей

высокая латентность оперативной памяти

достаточно большое количество регистров

14

Архитектура NVIDIA CUDA

Структурная схема

Организация программы

 

вычислительного устройства

 

 

 

 

 

HOST

DEVICE

 

 

 

 

.

GRID 1

 

 

 

.

 

 

 

 

 

.

KERNEL 1

 

 

 

 

 

BLOCK

BLOCK

BLOCK

 

 

 

 

(0;0)

(1;0)

(2;0)

 

 

BLOCK

BLOCK

BLOCK

 

 

(0;1)

(1;1)

(2;1)

 

 

GRID 2

 

 

 

 

KERNEL 2

 

 

 

 

 

 

 

BLOCK (1;1)

 

 

 

THREAD THREAD THREAD THREAD THREAD

 

(0;0)

(1;0)

(2;0)

(3;0)

(4;0)

 

THREAD THREAD THREAD THREAD THREAD

 

(0;1)

(1;1)

(2;1)

(3;1)

(4;1)

 

THREAD THREAD THREAD THREAD THREAD

 

(0;2)

(1;2)

(2;2)

(3;2)

(4;2)

 

 

 

 

 

15

Архитектура NVIDIA CUDA

расширения языка

определение типа памяти

определение типа процедуры

задание конфигурации выполнения (execution configuration)

синхронизация нитей блока

идентификаторы нити и блока

начиная с CUDA 7 поддерживается стандарт C++11

программный интерфейс

выделение и освобождение памяти на устройстве CUDA

пересылка данных

запуск вычислительных ядер и управление их выполнением

получение информации об устройстве CUDA

16

Архитектура NVIDIA CUDA

типы процедур

тип процедуры

вызывается из

выполняется на

 

 

 

__host__

HOST

HOST

 

 

 

__device__

DEVICE

DEVICE

 

 

 

__global__

HOST

DEVICE

 

 

 

типы памяти

Тип памяти

Доступ из

Доступ из хоста

Уровень

Скорость работы

 

 

устройства

 

выделения

 

 

 

 

 

 

 

 

Регистровая

чтение/запись

нет

поток

высокая (на чипе)

 

 

 

 

 

 

 

Локальная

чтение/запись

нет

поток

низкая (GPU RAM)

 

 

 

 

 

 

 

Разделяемая

чтение/запись

нет

блок

высокая (на чипе)

 

 

 

 

 

 

 

Глобальная

чтение/запись

чтение/запись

решётка

низкая (GPU RAM)

 

 

 

 

 

 

 

Константная

только чтение

чтение/запись

решётка

высокая (кэшируется)

 

 

 

 

 

 

 

Текстурная

только чтение

чтение/запись

решётка

высокая (кэшируется)

 

 

 

 

 

 

 

 

 

 

 

архитектура Tesla

17

Архитектура NVIDIA CUDA

Fermi

-двухуровневый кэш на чтение и запись для глобальной памяти

-параллельное выполнение ядер для одного приложения

-единое адресное пространство для всех типов памяти

Kepler

-указатели на функции;

-возможность запускать ядра из других ядер (Dynamic Parallelism);

-возможность нескольким процессорным ядрам запускать вычисления на GPU (Hyper-Q);

-поддержка RDMA (Remote Direct Memory Access): возможность обмена данными с другими ускорителями и устройствами, расположенными в том числе вне данного компьютера, без участия CPU (Nvidia использует также название GPUDirect)

Maxwell

-улучшение энергоэффективности (GFlops/W);

-увеличено количество регистров, ёмкость разделяемой памяти и количество активных блоков на SM;

-производительность 1,3 TFlops

18

Пример программы

// Код, выполняющийся на GPU

__global__ void VecAdd(float* A, float* B, float* C, int N) { int i = blockDim.x * blockIdx.x + threadIdx.x;

if (i < N)

C[i] = A[i] + B[i];

}

// Код, выполняющийся на CPU int main() {

int N = ...; // Количество элементов массива size_t size = N * sizeof(float);

//Выделенние памяти на хосте float* h_A = (float*)malloc(size); float* h_B = (float*)malloc(size);

//Загрузка входных данных

...

//Выделение памяти на устройстве float* d_A, *d_B, *d_C; cudaMalloc((void**)&d_A, size); cudaMalloc((void**)&d_B, size); cudaMalloc((void**)&d_C, size);

//Копирование данных из памяти хоста в память устройства cudaMemcpy(d_A, h_A, size, cudaMemcpyHostToDevice); cudaMemcpy(d_B, h_B, size, cudaMemcpyHostToDevice);

//Задание размерности решётки

int threadsPerBlock = 256;

int blocksPerGrid = (N + threadsPerBlock – 1) / threadsPerBlock; // Вызов ядра

VECADD<<<BLOCKSPERGRID, THREADSPERBLOCK>>>(D_A, D_B, D_C, N);

//Копирование результата из памяти устройства в память хоста cudaMemcpy(h_C, d_C, size, cudaMemcpyDeviceToHost);

//Освобождение памяти на устройстве

cudaFree(d_A);

 

cudaFree(d_B);

 

cudaFree(d_C);

 

// Освобождеие памяти на хосте

 

...

19

 

}

Представление рациональных чисел

Рациональные числа представляются обыкновенными дробями: a/b

Числитель и знаменатель представлены в формате, допускающем распараллеливание арифметических операций.

Дополнительные ограничения:

отсутствует возможность сокращения дробей

отсутствует преобразование в формат с плавающей запятой

отсутствует преобразование числителя и знаменателя в позиционную систему счисления

Область эффективного применения вычислений с ослаблением влияния ошибок округления для графических процессоров: вычисления предикатов для массива входных данных

20