УДК 004.051

Є.В. Крилов, В.К. Анікін, С.В. Котирло

МОДЕль ПАРАЛЕЛЬНОГО ПРОГРАМУВАННЯ НА PHP

Існують наступні програмні моделі роботи в обчислювальних системах: модель розділеної пам’яті, послідовна модель, модель розділених даних, модель передачі повідомлень. Для роботи з PHP можливо використовувати лише модель передачі повідомлень. Програми моделі обміну повідомленнями утворюють велике число процесів. Локальні дані асоційовані з кожним процесом, кожен з яких має унікальне ім'я. Взаємодія процесів відбувається за рахунок відправки і отримання повідомлень.

На практиці склалося так, що більшість систем обміну повідомленнями при запуску паралельної програми створює фіксоване число ідентичних процесів і не дозволяє створювати і руйнувати процеси протягом роботи програми.

В даних системах кожен з процесів виконує одну і ту ж програму, але працює з різними даними. Вони реалізують SPMD модель програмування, що означає одна програма та багато даних.

Розподілимо навантаження по процесам, скориставшись схемою обчислення кількості під задач для блочного розподілу. Нехай, є цикл в приблизно однакових за тривалістю ітерацій і потрібно розподілити його між N процесами, причому n не кратне N. На основі розподілу із залишком кількість ітерацій може бути представлено через цілі числа a, b в такій формі:

                                                                                        (1)

Ширина інтервалу ітерацій для кожного процесу  може бути обчислена:

                                                                                                (2)

Ліва межа кожного інтервалу  може бути обчислена на основі тих же співвідношень:

                                                                              (3)

При цьому на кожен процес розподіляється інтервал ітерацій [3]

                                                                                                        (4)

Експериментальне дослідження

Щоб реалізувати скрипт диригент можна використовувати стандартну функцію PHP – fsockopen(), яка ініціює поточное з'єднання, використовуючи TCP або UDP. Для домену Internet - відкриває сокет з'єднання TCP з hostname через порт port. hostname може бути в цьому випадку або повним кваліфікованим ім'ям домену, або IP-адресою. Для UDP необхідно явно специфікувати протокол шляхом додавання до hostname префікса 'udp: //'. fsockopen() повертає покажчик файлу, який може використовуватися іншими функціями (такими як fgets (), fgetss (), fputs (), fclose () і feof ()) [5].

Стандартно з’єднання відкривається з блокування, отже неможливо відкрити нове з’єднання без завершення попереднього. Програма виконується послідовно. Функція stream_set_blocking() дозволяє відкрити декілька з’єднань у паралельному режимі. Виконавцями можуть бути окремі скрипти або скрипт запущений декілька разів з різними вхідними параметрами.

Завдяки функції fsockopen скрипт диригент викликає виконавців, передає вхідні параметри та отримує результат виконання.

Кожен виконавець  і диригент працюватимуть у різних потоках і ОС, за наявності ресурсів, зможе забезпечити їх паралельне виконання [4].

Для моделювання розрахунків можна обрати алгоритм розрахунку числа Пі, шляхом чисельного інтегрування. Скористаємося методом прямокутників.

Оголосимо деяку кількість n прямокутників на які ми розіб’ємо нашу площу під інтегралом, порахуємо основу, а також всю площу, порахувавши значення функції в кожному прямокутнику і помножимо на основу.

В результаті отримали 10.894656719318с.

Виконаємо декомпозицію алгоритму, використовуючи метод програмної конвеєризації циклів. Це забезпечить об’єднання ітерації при виконанні з невеликим зрушенням по відношенню один до одного.

З метою збільшення точності вимірів для кожної кількості виконавців виконаємо по 10 ітерацій і зафіксовано мінімальний час обрахунку. Мінімальний час використовується через те, що саме у поточний момент процесор був завантажений найменше сторонніми процесами.

Проведемо експериментальні виміри для обчислень з використанням від 1 до 15 виконавців, з проходом у 40,000,000 інтервалів[5].

Висновки: Зростання кількості виконавців зменшує час виконання обчислень. Обчислення в 1 потік використовує одне ядро процесора і розрахунок триває 11.3 с. Збільшення потоків зменшує час обрахунку (на 8 потоках швидкодія зростає на 72%).

 

 

ПЕРЕЛІК ВИКОРАСТАНИХ ДЖЕРЕЛ

1.     Карпов В. Е.  Введение в распараллеливание алгоритмов и программ / В. Е. Карпов // Компьютерные исследования и моделирование – 2010 - Т. 2 №3 С. 231–272.

2.     Антонов А.С. Введение в паралельные вычисления / А. С. Антонов // Московский государственный университет им. Ломоносова–2002-70 с.

3.     Крилов Є.В. Оптимізація роботи веб-сервера для взаємопов’язаних процесів / Є.В. Крилов, В.К. Анікін, А.О. Шумада // Міжвідомчий науково-технічний збірник «Адаптивні системи автоматичного управління». – 2014. -  №1(24). – С.46-52.

4.     Федотов И. Е. Некоторые приемы параллельного программирования / И. Е. Федотов // Московский государственный институт радиотехники –2008–188с.

5.     Крилов Є.В., Анікін В.К., Стельмах В.І., Розробка моделі паралельного програмування на PHP // Адаптивнi системи автоматичного управлiння // Мiжвiдомчий науково-технiчний збiрник.— Київ: Нацiональний технiчний унiверситет України «Київський полiтехнiчний інститут» , – 2014. – Вип. 00. – C.