Python3 multiprocessing. Чтение-запись ячеек матрицы в общей памяти.

Как правильно задавать вопросы Правильно сформулированный вопрос и его грамотное оформление способствует высокой вероятности получения достаточно содержательного и по существу ответа. Общая рекомендация по составлению тем: 1. Для начала воспользуйтесь поиском форума. 2. Укажите версию ОС вместе с разрядностью. Пример: LM 19.3 x64, LM Sarah x32 3. DE. Если вопрос касается двух, то через запятую. (xfce, KDE, cinnamon, mate) 4. Какое железо. (достаточно вывод inxi -Fxz в спойлере (как пользоваться спойлером смотрим здесь)) или же дать ссылку на hw-probe 5. Суть. Желательно с выводом консоли, логами. 6. Скрин. Просьба указывать 2, 3 и 4 независимо от того, имеет ли это отношение к вопросу или нет. Так же не забываем об общих правилах Как пример вот
Аватара пользователя

Автор темы
MrTowelie
Сообщения: 218
Зарегистрирован: 24 июл 2017, 09:01
Решено: 8
Благодарил (а): 16 раз
Поблагодарили: 47 раз
Контактная информация:

Python3 multiprocessing. Чтение-запись ячеек матрицы в общей памяти.

#1

08 дек 2021, 01:11

Здравствуйте, интересует небольшой теоретический вопрос.
Собираюсь распараллелить часть своего кода, отвечающего за равномерное распределение случайно распределенных точек в объеме силами отталкивания.
В общей памяти будут содержаться координаты точек, заданные одномерными массивами, тип ячеек: float64.
В рамках программы устаревание данных не интересует, а разные ядра процессора не могут производить запись в одинаковые ячейки, но считывать могут все ячейки.

И вот здесь вопрос. Могут ли 2 разных ядра процессора одновременно производить и чтение, и запись числа из ОДНОЙ ОДИНАКОВОЙ ячейки матрицы в общей памяти? Т.е. может ли случиться так, что какое-то ядро прочитает не полностью записанное число, если такая запись вообще возможна? Или же два ядра встанут в очередь даже без явного её указания, обращаясь к одинаковой ячейке?

Вырезка кода задания общей памяти из другого моего кода (случай отличается, но принцип тот же):

Код: Выделить всё

import numpy as np
from multiprocessing import Process
from multiprocessing import shared_memory
if __name__ == '__main__':
    a=np.zeros((2, 12)) #вид матрицы памяти
    shm=shared_memory.SharedMemory(create=True, size=a.nbytes) #размер общей памяти
    b=np.ndarray(a.shape, dtype=a.dtype, buffer=shm.buf) #матрица, имеющая доступ в общую память
    b[:] = a[:] # заполнение общей памяти начальными данными

Решение slant » 08 дек 2021, 01:55
MrTowelie, https://docs.python.org/3/glossary.html ... reter-lock
global interpreter lock
The mechanism used by the CPython interpreter to assure that only one thread executes Python bytecode at a time. This simplifies the CPython implementation by making the object model (including critical built-in types such as dict) implicitly safe against concurrent access. Locking the entire interpreter makes it easier for the interpreter to be multi-threaded, at the expense of much of the parallelism afforded by multi-processor machines.
Т.е. python в основном сам все умеет. По крайней мере это касается его встроенных типов данных.

Так же: https://docs.python.org/3/library/multi ... processing
multiprocessing package offers both local and remote concurrency, effectively side-stepping the Global Interpreter Lock by using subprocesses instead of threads.
Т.е. писался специально с учетом GIL.

Перейти к ответу ➙

Аватара пользователя

WWolf
Сообщения: 3893
Зарегистрирован: 14 фев 2018, 00:51
Решено: 31
Откуда: Краснодар
Благодарил (а): 1687 раз
Поблагодарили: 1212 раз
Контактная информация:

Python3 multiprocessing. Чтение-запись ячеек матрицы в общей памяти.

#2

08 дек 2021, 01:33

MrTowelie, ну половинчатые данные не прочтёт, но за счёт буферизации или состояния гонки достоверности данных не будет. Нужны механизмы атомарного доступа.
Может питон это делает сам, но на С надо использовать семафоры/мьютексы/флаги

Аватара пользователя

slant
Сообщения: 4504
Зарегистрирован: 21 июн 2017, 18:09
Решено: 99
Благодарил (а): 51 раз
Поблагодарили: 1992 раза
Контактная информация:

Python3 multiprocessing. Чтение-запись ячеек матрицы в общей памяти.

#3

08 дек 2021, 01:55

MrTowelie, https://docs.python.org/3/glossary.html ... reter-lock
global interpreter lock
The mechanism used by the CPython interpreter to assure that only one thread executes Python bytecode at a time. This simplifies the CPython implementation by making the object model (including critical built-in types such as dict) implicitly safe against concurrent access. Locking the entire interpreter makes it easier for the interpreter to be multi-threaded, at the expense of much of the parallelism afforded by multi-processor machines.
Т.е. python в основном сам все умеет. По крайней мере это касается его встроенных типов данных.

Так же: https://docs.python.org/3/library/multi ... processing
multiprocessing package offers both local and remote concurrency, effectively side-stepping the Global Interpreter Lock by using subprocesses instead of threads.
Т.е. писался специально с учетом GIL.

Аватара пользователя

Автор темы
MrTowelie
Сообщения: 218
Зарегистрирован: 24 июл 2017, 09:01
Решено: 8
Благодарил (а): 16 раз
Поблагодарили: 47 раз
Контактная информация:

Python3 multiprocessing. Чтение-запись ячеек матрицы в общей памяти.

#4

08 дек 2021, 06:31

Спасибо за ответы, пригодится эта информация в будущем.
Распараллелил эту часть кода. Система приходит к стабильному состоянию и выдаёт аналогичный однопоточному режиму ответ.

Закрыто

Вернуться в «Программирование, скриптинг, виртуализация»

Кто сейчас на конференции

Сейчас этот форум просматривают: ogankvik, rogoznik и 3 гостя