Какова формула для равномерного нарезания вложенного цикла в потоках? - PullRequest
0 голосов
/ 07 февраля 2019

Наличие набора данных, где в каждом ряду должна применяться функция взвешивания в сочетании с каждым другим рядом (перекрестное соединение).Применяется ли функция, зависит от данных в обеих строках, поэтому я не могу просто использовать базу данных.

Следовательно, решение реализовано на python.Для повышения производительности следует применять многопоточность.

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

Упрощенная версия кода приведена ниже.

l = 250000  # number of rows
N = 8       # number of threads
for threadid in range(N):
    kstart = ### WHAT IS THE FORMULA TO GIVE EACH THREAD THE SAME WORK
             ### i.e. the starting index of the next thread begins after the last row of the previous thread
    klen =
    # Start thread here
    #threading.Tread(..., (kstart,klen))

def _threaded(kstart, klen):
    for k1 in range(kstart, klen):
        for k2 in range(k1, l - k1):
            # DoSomething(k1, k2)
            pass

Пример:

Показанный выше цикл приводит к следующим итерациям:

k1     | k2
0      | 0 to 249999 = 250000 iterations in inner loop
1      | 1 to 249999 = 249999 iterations in inner loop
2      | 2 to 249999 = 249998 iterations in inner loop
...
249999 | 249999 = 1 iteration in inner loop
  • Простойверсия kstart может быть: 'l // N * threadid' - это распространяет весь набор в равномерно распределенные группы.

Тема 1: 0 - 31249

Тема 2: 31250- 62499

...

Thread 8: 218750 - 249999

  • Теперь мы позволим циклу k1 выполнить kstart до kstart следующей партии.
  • Проблема сейчас в том, что для малых k1, k2 приходится много работать.Для большого k1 работа почти равна нулю.

Как лучше нарезать партии для k1, чтобы?

Thread 1: 0 - 10

Thread2: 11 - 100

Тема 3: 101 - 500

Тема 8: 128000 - 250000

(это пример, цифры не верны)

...