• Document: Программно-аппаратный стек CUDA. Иерархия памяти. Глобальная память.
  • Size: 1.02 MB
  • Uploaded: 2018-12-08 18:38:22
  • Status: Successfully converted


Some snippets from your converted document:

Лекция 2 Программно-аппаратный стек CUDA. Иерархия памяти. Глобальная память. • Лекторы: • Боресков А.В. ( ВМиК МГУ ) • Харламов А.А. ( NVIDIA ) Классификация • Системы с общей (shared) памятью • Системы с распределённой (distributed) памятью • Гибридные (hybrid) системы Проблемы • Общая память: • Синхронизация • Распределённая память: • Коммуникация между узлами CUDA ( Compute Unified Device Architecture) • CUDA – программно аппаратный стек для программирования GPU CUDA «Hello World» #define N (1024*1024) __global__ void kernel ( float * data ) { int idx = blockIdx.x * blockDim.x + threadIdx.x; float x = 2.0f * 3.1415926f * (float) idx / (float) N; data [idx] = sinf ( sqrtf ( x ) ); } int main ( int argc, char * argv [] ) { float * a; float * dev = NULL; a = ( float* ) malloc (N * sizeof ( float ) ); cudaMalloc ( (void**)&dev, N * sizeof ( float ) ); kernel<<<dim3((N/512),1), dim3(512,1)>>> ( dev ); cudaMemcpy ( a, dev, N * sizeof ( float ), cudaMemcpyDeviceToHost ); for (int idx = 0; idx < N; idx++) printf("a[%d] = %.5f\n", idx, a[idx]); free(a); cudaFree(dev); return 0; } Подход CUDA Исходная задача Подзадача Подзадача Подзадача • Исходная задача разбивается на подзадачи, которые можно решать независимо друг от друга. • Каждая из этих подзадач решается набором взаимодействующих между собой нитей Программная модель CUDA • Код состоит как из последовательных, так и из параллельных частей • Последовательные части кода выполняются на CPU • Массивно-параллельные части кода выполняются на GPU как функция-ядро ( kernel function ) Программная модель CUDA • GPU (device) это вычислительное устройство, которое: • Является сопроцессором к CPU (host) • Имеет собственную память (DRAM) • Выполняет одновременно очень много нитей Программная модель CUDA • Последовательные части кода выполняются на CPU • Массивно-параллельные части кода выполняются на GPU как ядра • Отличия нитей между CPU и GPU • Нити на GPU очень «легкие» • HW планировщик задач • Для полноценной загрузки GPU нужны тысячи нитей • Для покрытия латентностей операций чтения / записи • Для покрытия латентностей sfu инструкций Программная модель CUDA • Параллельная часть кода выполняется как большое количество нитей (threads) • Нити группируются в блоки (blocks) фиксированного размера • Блоки объединяются в сеть блоков (grid) • Ядро выполняется на сетке из блоков • Каждая нить и блок имеют свой уникальный идентификатор Программная модель CUDA • Десятки тысяч потоков for (int ix = 0; ix < nx; ix++) { pData[ix] = f(ix); } for (int ix = 0; ix < nx; ix++) for (int iy = 0; iy < ny; iy++) { pData[ix + iy * nx] = f(ix) * g(iy); } for (int ix = 0; ix < nx; ix++) for (int iy = 0; iy < ny; iy++) for (int iz = 0; iz < nz; iz++) { pData[ix + (iy + iz * ny) * nx] = f(ix) * g(iy) * h(iz); } Программная модель CUDA • Потоки в CUDA объединяются в блоки: • Возможна 1D, 2D, 3D топология блока • Общее кол-во потоков в блоке ограничено • В текущем HW это 512 потоков Программная модель CUDA • Блоки могут использовать shared память • Т.к. блок целиком выполняется на одном SM • Объем shared памяти ограничен и за

Recently converted files (publicly available):