es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Numba: El indicador de paralelización en @jit no funciona en mi código con matrices 2D de numpy.

Primero, hice esta pregunta https://stackoverflow.com/q/70337313/7462275. Al intentar muchas cosas mientras descubría numba, surgió esta pregunta más básica.

¿Por qué este código funciona (bandera ‘parallel’ establecida en False)?

import numpy as np
from numba import jit, prange

@jit(''float64[:,:], float64[:,:], float64[:]'', nopython=True, parallel=False)
def myFoo(result, par, x):
    length = len(x)
    for i in prange(length):
        result[:,i:i+1] = (par[:,0:1] * np.exp(par[:,1:2] * x[i]))

x = np.array(np.arange(0, 20, 1.0))
par = np.array([[i*10, i*0.1] for i in range(10)])
result = np.empty([par.shape[0], x.shape[0]], dtype=np.float64)
myFoo(result, par, x)

Pero cuando cambio la bandera ‘parallel’ a True, no funciona. El mensaje de error es:

TypingError: Failed in nopython mode pipeline (step: nopython mode backend)
Failed in nopython mode pipeline (step: nopython frontend)
No implementation of function Function(<intrinsic assert_equiv>) found for signature:

 >>> <unknown function>(Literal[str](Sizes of result, $72binary_multiply.31 do not match on /tmp/ipykernel_64043/4263189787.py (13)), float64, int64)

There are 2 candidate implementations:
    - Of which 2 did not match due to:
    Intrinsic in function 'assert_equiv': File: numba/parfors/array_analysis.py: Line 127.
      With argument(s): '(unicode_type, float64, int64)':
     Rejected as the implementation raised a specific error:
       AssertionError: 
  raised from ... lib/python3.9/site-packages/numba/parfors/array_analysis.py:143
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    La razón por la que el código no funciona cuando se establece el indicador paralelo en Verdadero es que la declaración assert en el código se está activando. Esto se debe a que cuando el código se paraleliza, cada hilo está escribiendo en la misma ubicación de memoria en el arreglo de resultados, lo que lleva a una condición de carrera. Esto provoca que los tamaños de los arreglos de resultados sean inconsistentes, activando la declaración assert.

    Para solucionar este problema, es necesario modificar el código para asegurar que cada hilo trabaje en una parte separada del arreglo de resultados. Una forma de lograr esto es utilizando la variable de indexación del bucle para calcular la porción adecuada del arreglo de resultados en la que cada hilo debe trabajar. Otra solución es utilizar un arreglo temporal para acumular los resultados de cada hilo y luego copiar los resultados en el arreglo de resultados real.

    En general, al paralelizar el código con Numba, es importante asegurarse de que el código sea seguro para los hilos y que no haya condiciones de carrera u otros problemas que puedan surgir cuando múltiples hilos acceden a variables o ubicaciones de memoria compartidas. La documentación de Numba proporciona orientación útil y ejemplos sobre cómo escribir código paralelo eficiente y seguro utilizando Numba.

Comments are closed.