2017-02-03 5 views
2

Какие алгоритмы используются для сопоставления массива изображений с несколькими ядрами для обработки? Я пытался придумать что-то, что вернет список (непересекающихся) диапазонов, по которым итерация в массиве, и до сих пор у меня есть следующее.Разделить массив на подмассивы как можно более равномерным для отображения ядра

#!/usr/bin/env python3 
# -*- coding: utf-8 -*- 

import numpy as np 


def divider(arr_dims, coreNum=1): 
    """ Get a bunch of iterable ranges; 
    Example input: [[[0, 24], [15, 25]]] 
    """ 
    if (coreNum == 1): 
     return arr_dims 

    elif (coreNum < 1): 
     raise ValueError(\ 
     'partitioner expected a positive number of cores, got %d'\ 
        % coreNum 
     ) 

    elif (coreNum % 2): 
     raise ValueError(\ 
     'partitioner expected an even number of cores, got %d'\ 
        % coreNum 
     ) 

    total = [] 

    # Split each coordinate in arr_dims in _half_ 
    for arr_dim in arr_dims: 
     dY = arr_dim[0][1] - arr_dim[0][0] 
     dX = arr_dim[1][1] - arr_dim[1][0] 

     if ((coreNum,)*2 > (dY, dX)): 
      coreNum = max(dY, dX) 
      coreNum -= 1 if (coreNum % 2 and coreNum > 1) else 0 

     new_c1, new_c2, = [], [] 

     if (dY >= dX): 
      # Subimage height is greater than its width 
      half = dY // 2 
      new_c1.append([arr_dim[0][0], arr_dim[0][0] + half]) 
      new_c1.append(arr_dim[1]) 

      new_c2.append([arr_dim[0][0] + half, arr_dim[0][1]]) 
      new_c2.append(arr_dim[1]) 

     else: 
      # Subimage width is greater than its height 
      half = dX // 2 
      new_c1.append(arr_dim[0]) 
      new_c1.append([arr_dim[1][0], half]) 

      new_c2.append(arr_dim[0]) 
      new_c2.append([arr_dim[1][0] + half, arr_dim[1][1]]) 

     total.append(new_c1), total.append(new_c2) 

    # If the number of cores is 1, we get back the total; Else, 
    # we split each in total, etc.; it's turtles all the way down 
    return divider(total, coreNum // 2) 


if __name__ == '__main__': 
    import numpy as np 
    X = np.random.randn(25 - 1, 36 - 1) 
    dims = [zip([0, 0], list(X.shape))] 
    dims = [list(j) for i in dims for j in dims[0] if type(j) != list] 
    print(divider([dims], 2)) 

Это невероятно ограничено, однако, поскольку он принимает только количество ядер, что некоторая степень 2, а затем я уверен, что есть крайние случаи, я с видом. Запуск он возвращает [[[0, 24], [0, 17]], [[0, 24], [17, 35]]], а затем с помощью pathos Я сопоставил первый набор с одним ядром в своем ноутбуке, а второй - с другим.

Я думаю, что я просто не знаю, как геометрически прокладывать себе путь путем разбиения изображения на сегменты, которые похожи на размер, насколько это возможно, так что каждое ядро ​​на данной машине имеет такое же количество работы делать.

+0

Я не совсем уверен, что вы пытаетесь сделать здесь (я не знаком с графической обработкой), но многопроцессорность python имеет концепцию «пула», в которой есть несколько работников, и вы можете отправлять каждому работнику например, партия 100 данных, которые он обрабатывает и возвращает, а затем ждет следующей партии. Таким образом, вам не нужно равномерно распределять задания по количеству доступных ядер, но вы можете просто отправить их в куски. Это поможет решить вашу проблему? – hansaplast

ответ

1

Я не слишком уверен, чего вы пытаетесь достичь, но если вы хотите разделить массив (любых измерений) на несколько частей, вы можете посмотреть на метод numpy.array_split numpy.array_split.

Он разбивает массив на почти равное количество частей, поэтому он работает даже тогда, когда количество разделов не может чисто разделить массив.

 Смежные вопросы

  • Нет связанных вопросов^_^