(Отново) За паралелното програмиране

Що е то паралелно програмиране и има ли то почва у нас? Само допреди няколко години паралелното програмиране се свързваше и на практика отъждествяваше с високопроизводителните изчисления (HPC), както се оказва съм писал тук преди години, което ограничаваше използването му предимно до учени и инженери. С непрекъснатото нарастване на броя на ядрата в съвременните микропроцесори и с все по-широкото разпространение на технологии като машинно самообучение (machine learning) и изкуствен интелект, обаче, става все по-желателно познаването на технологиите на паралелното програмиране. Последното е видимо и от нарастващият брой въпроси в Stack Overflow, касаещи парадигми за паралелно програмиране като OpenMP и MPI. Англоезични книги и самоучители по въпроса има много, но по отношение на българоезичните материали зее известна празнина, която ще се опитам да запълня.

Като цяло могат да се разграничат три типа изчислителни системи, за програмирането на всяка от които съществува определен тип естествена парадигма (или множество парадигми):

  • системи със споделена памет, при които множество процесори (ядра и/или хардуерни нишки) имат достъп до физически споделено адресно пространство. Естественият програмен модел върху такива системи е използването на множество нишки, а най-широко разпространената парадигма е OpenMP (без да включвам интерфейсите за многонишково програмиране от ниско ниво като Pthreads и Win32);
  • системи с разпределена памет, при които множество процесори с отделни физически адресни пространства са свързани помежду си с комуникационна мрежа. Естественият програмен модел в този случай е предаването на съобщения, явно в комуникационни библиотеки като MPI и неявно в езици от типа на Universal Parallel C (UPC) и Co-array Fortran (CAF);
  • масивно-паралелни приставки като графични карти (GPGPU) и копроцесори (напр. Intel Xeon Phi). Подобни системи изискват по-особени програмни модели, които отчитат факта, че части от програмата се изпълняват върху различна и често специализирана архитектура. Сред разпространените парадигми са CUDA и OpenCL, а от известно време и OpenMP.

MPI не е особено подходяща за първи стъпки в паралелното програмиране, не само поради алгоритмичните трудности, свързани с разпределения характер на програмното изпълнение, но и поради липсата на широко достъпни адекватни инструменти за настройка на програмите. CUDA, OpenCL и сродните им технологии са интересни, но рядко универсално приложими, а също така изискват и наличието на съответния хардуер. За сравнение, практически всеки модерен процесор е многоядрен с евентуална възможност за изпълнение на няколко хардуерни нишки в рамките на всяко ядро [1], а повечето компилатори с много малки изключения поддържат OpenMP, което я прави идеален “трамплин” към света на паралелната обработка на данни.

[1] технология, известна под наименования като SMT, hyperthreading, и др.

Коментари