Ускорение Хаусдорфа в родном Python?

#python #multidimensional-array #parallel-processing #gpu #spatial

#python #многомерный массив #параллельная обработка #графический процессор #пространственный

Вопрос:

У меня есть два массива Numpy, которые описывают 3D-модель, каждый из которых имеет форму (471843, 3) , где ‘3’ обозначает значения пространственных координат, x, y и z, а ‘471843’ являются вершинами. Я пытаюсь вычислить расстояние Хаусдорфа между ними, используя функцию Хаусдорфа из https://github.com/mavillan/py-hausdorff.

Функция выполняется, но, похоже, не останавливается. Он работал почти 40 минут и все еще не показывал никаких признаков остановки. Это потому, что это займет много времени или по какой-то другой причине? Кроме того, насколько я понимаю, это распараллеливаемая функция, так как я могу экспортировать выполнение на графические процессоры CUDA, чтобы ускорить процесс?

Ответ №1:

Вопрос: «Это потому, что это займет много времени или по какой-то другой причине?»

Протестируйте это!
Запустите ту же самую функцию для ( 1E1, 1E2, 1E3, 1E4 ) точек данных, и вы сможете легко получить ETA для 4.7E5 точек данных. Это справедливо, не так ли?

    from zmq import Stopwatch; aClk = Stopwatch()

   SIZINGs = ( 1E1, 2E1, 5E1,
               1E2, 2E2, 5E2,
               1E3, 2E3, 5E3,
               1E4, 2E4, 5E4
               )
   MASK    = "INF: a problem-size {0:>5d} took {1:>12d} [us] to process"
   TIMINGs = {}

   #-------------------------------------------------------------------------
   print(  80*"_" )
   for aSize in SIZINGs:
       aClk.start()
       _ = 3D_wrapper_for_HausdorfDistance( data     = DATA[:int(aSize),:],
                                            distance = aCustomHausdorfDistance_in3D
                                            )
       TIMINGs[aSize] = aClk.stop()
       print( MASK.format( aSize, TIMINGs[aSize] )
   print(  80*"_" )
   #-------------------------------------------------------------------------
  

Вопрос: «… как я могу экспортировать выполнение на графические процессоры CUDA, чтобы ускорить процесс?»

Сначала решите, имеет ли смысл проектировать и выполнять CUDA-ядро, чтобы оно имело смысл для использования с точки зрения производительности. Если это обнаружится, не будет никакого шанса работать быстрее, чем на нативном N x 3 [GHz] устройствеБОЛЬШИМ кешем, тогда и только тогда начинайте попытки портировать алгоритм, чтобы эффективно использовать современные GPU SMX SIMD-процессоры ограниченной точности.