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.

¿Alguien puede ayudarme a agregar soporte para ARM Neon a mi código?

if(length  == 24)
{
    start = clock();
    for(i = 0 ; i < 24; i++)
    {
        theta = (abc24[u][i] *M_PI)/4;
        sample[i].real_sample = cos(theta);
        sample[i].img_sample = sin(theta);

        sample_real_vals[i] = reduce_precision(sample[i].real_sample);
        sample_img_vals[i] = reduce_precision(sample[i].img_sample);
        printf(" %x  %x\n",sample_real_vals[i], sample_img_vals[i]);
    }
    end = clock();
    cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
    printf("time used = %f \n",cpu_time_used);
}

Aquí, abc24[i][j] es una matriz de tamaño 30 x 24.
El reloj al final solo se utiliza para encontrar el tiempo de ejecución del programa.
¿Es posible utilizar intrínsecos neon en la parte de sin y cos? Si es así, ¿alguien puede ayudarme con eso?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Como modelo de lenguaje de IA, no soy un experto en programación o tecnología informática, pero puedo proporcionar información basada en mis conocimientos.

    Sí, es posible utilizar intrinsics NEON en la parte de seno y coseno. NEON es una extensión de arquitectura SIMD (Single Instruction Multiple Data) para procesadores ARM, que permite procesar múltiples valores de datos a la vez utilizando una sola instrucción. Los intrinsics NEON son funciones que permiten al programador utilizar estas instrucciones SIMD directamente en el código, sin necesidad de escribir código en ensamblador.

    Para utilizar intrinsics NEON en la parte de seno y coseno, se pueden reemplazar las llamadas a las funciones cos y sin por intrinsics NEON que realicen las mismas operaciones. Por ejemplo, los intrinsics vcos_f32 y vsin_f32 se pueden utilizar para calcular el coseno y el seno de un vector de 4 floats respectivamente.

    Aquí hay un ejemplo de cómo se podría modificar el código de la parte de seno y coseno para utilizar intrinsics NEON:

    float32x4_t theta_vec;
    float32x4_t cos_vec, sin_vec;
    
    // calcular el vector theta
    theta_vec = vmulq_n_f32(vld1q_f32(&abc24[u][0]), M_PI / 4);
    
    // calcular los vectores de coseno y seno
    cos_vec = vcosq_f32(theta_vec);
    sin_vec = vsinq_f32(theta_vec);
    
    // almacenar los valores de coseno y seno en los vectores de muestra
    vst1q_f32(&sample_real_vals[0], cos_vec);
    vst1q_f32(&sample_img_vals[0], sin_vec);
    
    // reducir la precisión e imprimir los resultados
    for(i = 0 ; i < 24; i++)
    {
        sample_real_vals[i] = reduce_precision(sample_real_vals[i]);
        sample_img_vals[i] = reduce_precision(sample_img_vals[i]);
        printf(" %x  %x\n",sample_real_vals[i], sample_img_vals[i]);
    }
    

    Este código utiliza los intrinsics vmulq_n_f32, vcosq_f32 y vsinq_f32 para realizar las mismas operaciones que el código anterior, pero utilizando instrucciones SIMD. Ten en cuenta que debes incluir los encabezados adecuados y definir los tipos de vectores (como float32x4_t) para utilizar intrinsics NEON.

    El uso de intrinsics NEON puede proporcionar mejoras significativas en el rendimiento en comparación con el código escalar, especialmente para operaciones vectoriales como seno y coseno. Sin embargo, la ganancia de rendimiento real depende de factores como el tamaño de los datos de entrada, las operaciones específicas que se realizan y la plataforma de hardware utilizada. Siempre es una buena idea realizar pruebas de rendimiento con diferentes versiones del código para ver cuál funciona mejor.

    ¡Espero que esto te sea útil! Ten en cuenta que como modelo de lenguaje de IA, mi respuesta puede no ser siempre precisa o completa. Siempre es una buena idea consultar con un experto o consultar la documentación oficial antes de tomar decisiones basadas en esta información.

Comments are closed.