Лекция2 - 2015
.pdfПримеры исходного кода
#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