Как сделать numpy.take или slice multithread? [Дубликат]

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

12
задан Benjamin 7 January 2014 в 12:51
поделиться

2 ответа

Я искал способы легко многопоточить некоторые из моего простого кода анализа, так как я заметил numpy, что он использовал только одно ядро, несмотря на то, что он должен быть многопоточным.

< / blockquote>

Кто сказал, что он должен быть многопоточным?

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

В частности, вы можете одновременно работать с независимыми предметами, а медленные операции освобождают GIL, если это возможно, хотя «когда возможно» может быть недостаточно , Кроме того, объекты numpy предназначены для совместного использования или передачи между процессами как можно проще, чтобы облегчить использование multiprocessing.

Существуют некоторые специализированные методы, которые автоматически распараллеливаются, но большинство основных методов не. В частности, dot реализуется поверх BLAS, когда это возможно, и BLAS автоматически распараллеливается на большинстве платформ, но mean реализован в виде простого кода C.

См. Параллельное программирование с numpy и scipy для деталей.


Итак, как вы знаете, какие методы распараллелены, а какие нет? И, из тех, которые не являются, как вы знаете, какие из них могут быть хорошо обработаны вручную и которые нуждаются в многопроцессорности?

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

Но обычно лучше всего сделать попробуйте и проверьте. Если код использует 100% одного ядра и 0% других, добавьте ручную резьбу. Если теперь он использует 100% одного ядра и 10% других и работает не быстрее, измените многопоточность на многопроцессорность. (К счастью, Python делает это довольно легко, особенно если вы используете классы Executor из concurrent.futures или классов пула из multiprocessing. Но вам все равно часто нужно вникать в это и проверить относительные затраты на совместное использование vs. если у вас большие массивы.)

Кроме того, как указывает kwatford, просто потому, что какой-то метод не кажется неявно параллельным, не означает, что он не будет параллелен в следующей версии numpy , или следующей версии BLAS, или на другой платформе, или даже на машине с немного отличающимися на ней материалами. Поэтому будьте готовы к повторной проверке. И сделайте что-нибудь вроде my_mean = numpy.mean, а затем используйте my_mean всюду, поэтому вы можете просто изменить одну строку на my_mean = pool_threaded_mean.

12
ответ дан Mark Mikofski 19 August 2018 в 02:35
поделиться

В принципе, поскольку библиотека BLAS имеет оптимизированный точечный продукт, который они могут легко вызвать для dot, который по своей сути параллелен. Они признают, что могут расширять numpy, чтобы распараллелить другие операции, но отказались от этого маршрута. Тем не менее, они дают несколько советов о том, как распараллелить ваш код numpy (в основном, чтобы разделить работу между N ядрами (например, N = 4), разделить ваш массив на N подмассивов и отправить задания для каждого подматрица в собственный поток и затем объедините ваши результаты).

См. http://wiki.scipy.org/ParallelProgramming :

Использовать параллельные примитивы

Одна из самых больших достоинств numpy заключается в том, что вы можете выразить операции массива очень чисто. Например, чтобы вычислить произведение матрицы A и матрицы B, вы просто выполните:

>>> C = numpy.dot(A,B)

Это не просто и понятно для чтения и записи, поскольку numpy знает, что вы хотите сделать матричный точечный продукт, он может использовать оптимизированную реализацию, полученную как часть «BLAS» (подпрограммы базовой линейной алгебры). Обычно это библиотека, тщательно настроенная для быстрого запуска на вашем аппаратном обеспечении, используя преимущества кеш-памяти и реализации ассемблера. Но у многих архитектур теперь есть BLAS, который также использует многоядерную машину. Если ваш numpy / scipy скомпилирован с использованием одного из них, то точка () будет вычисляться параллельно (если это выполняется быстрее), если вы ничего не делаете. Аналогично для других матричных операций, таких как инверсия, декомпозиция сингулярных значений, детерминант и т. Д. Например, библиотека с открытым исходным кодом ATLAS позволяет выбирать время выбора уровня параллелизма (количество потоков). Собственная библиотека MKL от Intel предлагает возможность выбрать уровень параллелизма во время выполнения. Существует также библиотека GOTO, которая позволяет выбирать уровень параллелизма во время выполнения. Это коммерческий продукт, но исходный код распространяется бесплатно для академического использования.

Наконец, scipy / numpy не распараллеливает такие операции, как

>>> A = B + C

>>> A = numpy.sin(B)

>>> A = scipy.stats.norm.isf(B)

Эти операции выполняются последовательно, не пользуясь преимуществами многоядерных машин (но см. ниже). В принципе, это можно было бы изменить без особых усилий. OpenMP - это расширение для языка C, которое позволяет компиляторам создавать параллелизующий код для соответствующих аннотированных циклов (и других вещей). Если кто-то сел и аннотировал несколько циклов ядра в numpy (и, возможно, в scipy), и если один из них скомпилировал numpy / scipy с включенным OpenMP, все три из них автоматически будут запускаться параллельно. Конечно, на самом деле нужно было бы иметь некоторый контроль времени исполнения - например, можно было бы отключить автоматическую распараллеливание, если бы планировалось запустить несколько заданий на одной и той же машине с несколькими процессорами.

6
ответ дан TooTone 19 August 2018 в 02:35
поделиться
  • 1
    +1. Единственная проблема заключается в том, что они не гарантируют нигде, какие операции освобождают GIL и / или работают независимо от частичных подобъектов, просто они пытаются сделать все возможным. Поэтому вам в значительной степени нужно проверять ручную резьбу, пересечь пальцы и быть готовым вернуться к многопроцессорности, если это необходимо (и для достаточно большого массива вам также необходимо протестировать совместное использование и передачу для IPC). К счастью, Python позволяет легко вернуться к многопроцессорной обработке, когда это необходимо, так что это не очень дорого. – abarnert 17 May 2013 в 22:41
Другие вопросы по тегам:

Похожие вопросы: