Самый эффективный способ для рабочих процессов без труб - PullRequest
0 голосов
/ 12 марта 2020

В Python 3.6 (Ubuntu) у меня есть 32 рабочих процесса, которые я хочу использовать лучше всего, чтобы использовать все ядра ЦП. Каждый из процессов должен выполнять операции, основанные на большом массиве numpy.

Я думаю, что прямой путь заключается в использовании многопроцессорных каналов:

# Using a classic multi processing pool structure:
for c in range(cycles):
   for pipe in process_pipes:
      pipe[0].send(numpy_data)

, который работает нормально, но накладные расходы Стоимость довольно огромна. Сейчас я использую другой подход, который быстрее:

def pool_init(ab):
    global buffer_shared
    buffer_shared = ab

buffer_shared_base = mp.Array(ctypes.c_float, BUFFER_SHARED_SIZE)
buffer_shared = np.ctypeslib.as_array(buffer_shared_base.get_obj())
buffer_shared = buffer_shared.reshape(num_processes, BUFFER_SHARED_SIZE)

pool = mp.Pool(initializer=pool_init, initargs=(buffer_shared, ), processes=num_processes)

for c in range(cycles):
   # chunk_size is the numpy data size for each process
   buffer_shared[:, 0:chunk_size] = NEW_DATA
   for pipe in pipes:
      pipe[0].send(True)

Основная идея - использовать разделяемую память для передачи данных и просто использовать канал для передачи сигнала запуска. Это значительно быстрее, возможно, потому, что массив numpy не нужно использовать для травления.

Поскольку это решение все еще кажется мне неуклюжим, вы можете сказать мне, что вы считаете оптимальным (= минимальными издержками) для этот вид установки будет?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...