Функция numpy.dot не может быть выполнена одновременно - PullRequest
0 голосов
/ 08 октября 2019

Я сделал короткий пример программы для тестирования отдельных функций в сочетании с модулем потоков. Поэтому я вызвал функцию np.dot со случайными массивами разных размеров.

Общие результаты были в основном такими, как ожидалось. Метод test_serial немного быстрее, чем метод test_threading (из-за меньших накладных расходов?).

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

То, что я ожидал:

  • Запускает thread_0 (все ресурсы, используемые для np.dot (arg_1, arg_2)
  • Запускается thread_1 (ресурсы разделяются намежду np.dot (arg_1, arg_2) и np.dot (arg_3, arg_4)
  • и т. д.
  • обработка потоков 3 и 4 завершена (поскольку я использовал для них меньшие массивы)
  • thread 0, 1, 2 finish

Кажется, что numpy может выполнять только одну точечную операцию за раз. Может кто-то подтвердить это? Дальнейшие тесты показали, что это не относится к npОперация умножения.

Вывод np.dot :

--- start threaded test ---
--- start threads ---
start: 0
start: 1
start: 2
start: 3
start: 4
--- start threads done ---
-8.263092041015625
--- end ---  0
--- join thread ---
-16.34356927871704
--- end ---  1
--- join thread ---
-24.071669578552246
--- end ---  2
--- join thread ---
-23.95636224746704
--- end ---  3
--- join thread ---
-23.962880611419678
--- end ---  4
--- join thread ---
-24.32594323158264
--- end threaded test ---

Вывод np.multiply :

--- start threaded test ---
--- start threads ---
start: 0
start: 1
start: 2
start: 3
start: 4
--- start threads done ---
-0.007001638412475586
--- end ---  3
-0.007020235061645508
--- end ---  4
-0.3390059471130371
--- end ---  1
-0.3525271415710449
--- end ---  2
-0.3660862445831299
--- end ---  0
--- join thread ---
--- join thread ---
--- join thread ---
--- join thread ---
--- join thread ---
-0.36977648735046387
--- end threaded test ---
from threading import Thread, Lock
print_access = Lock()
import gc

def test_f1(arg_1, arg_2,out, num):
    with print_access:
        print("start:", num)
    xx = time.time()
    np.dot(arg_1, arg_2,out)
    with print_access:
        print(xx-time.time())
        print("--- end --- ", num)

def test_f2(arg_1, arg_2,out,  num):
    with print_access:
        print("start:", num)
    xx = time.time()
    np.multiply(arg_1, arg_2,out)
    with print_access:
        print(xx-time.time())
        print("--- end --- ", num)

def test_f3(arg_1, arg_2, out, num):
    with print_access:
        print("start:", num)
    xx = time.time()
    np.matmul(arg_1, arg_2,out)
    with print_access:
        print(xx-time.time())
        print("--- end --- ", num)


def test_serial(arg_1, arg_2, arg_3, arg_4,arg_5,arg_6,arg_7,arg_8, arg_9,arg_10,out_1, out_2, out_3, out_4, out_5):
    test_f2(arg_1,arg_2,out_1, 0)
    test_f2(arg_3,arg_4,out_2, 1)
    test_f2(arg_5,arg_6,out_3, 2)
    test_f2(arg_7,arg_8,out_4, 3)
    test_f2(arg_9,arg_10,out_5, 4)

def test_thread(arg_1, arg_2, arg_3, arg_4,arg_5,arg_6,arg_7,arg_8, arg_9,arg_10,out_1, out_2, out_3, out_4, out_5):
    t_1 = Thread(target = test_f2, args = (arg_1,arg_2,out_1,0))
    t_2 = Thread(target = test_f2, args = (arg_3,arg_4,out_2,1))
    t_3 = Thread(target = test_f2, args = (arg_5,arg_6,out_3,2))
    t_4 = Thread(target = test_f2, args = (arg_7,arg_8,out_4,3))
    t_5 = Thread(target = test_f2, args = (arg_9,arg_10,out_5,4))
    print("--- start threads ---")
    t_1.start()
    t_2.start()
    t_3.start()
    t_4.start()
    t_5.start()
    print("--- start threads done ---")
    t_1.join()
    print("--- join thread ---")
    t_2.join()
    print("--- join thread ---")
    t_3.join()
    print("--- join thread ---")
    t_4.join()
    print("--- join thread ---")
    t_5.join()
    print("--- join thread ---")

if __name__ == "__main__":
    x = 10000
    y = 1000
    array_1 = np.random.rand(x,x)
    array_2 = np.random.rand(x,x)

    array_3 = np.random.rand(x,x)
    array_4 = np.random.rand(x,x)
    array_5 = np.random.rand(x,x)
    array_6 = np.random.rand(x,x)
    array_7 = np.random.rand(y,y)
    array_8 = np.random.rand(y,y)
    array_9 = np.random.rand(y,y)
    array_10 = np.random.rand(y,y)

    out_1 = np.random.rand(x,x)
    out_2 = np.random.rand(x,x)
    out_3 = np.random.rand(x,x)
    out_4 = np.random.rand(y,y)
    out_5 = np.random.rand(y,y)


    print("--- start ---")
    xx = time.time()
    test_serial(array_1, array_2,array_3, array_4,array_5, array_6,array_7, array_8,array_9, array_10, \
                out_1,out_2,out_3, out_4, out_5)
    print(xx-time.time())
    print("--- end ---")

    time.sleep(0.5)
    gc.collect()
    time.sleep(0.5)

    print("--- start ---")
    xx = time.time()
    test_thread(array_1, array_2,array_3, array_4,array_5, array_6,array_7, array_8,array_9, array_10, \
                out_1,out_2,out_3, out_4, out_5)
    print(xx-time.time())
    print("--- end ---")
```



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