Teensy 3.6 - Fragen zu DSP und FPU (Oder: Wie kann ich schneller rechnen?)

Moin,

ich sehe gerade kein Land, weil mir ein paar Grundlagen fehlen. Ich bitte um Quellen zum selber Nachlesen, oder kurze Antworten, falls moeglich.

A) Wenn ich die CMSIS DSP Lib benutze, wird die DSP Hardware benutzt? B) Wenn A, aber zusaetzlich eine FPU da ist, wird diese benutzt, wenn die Datentypen passen? C) Davon unabhaengig kann man auch nur die FPU benutzen? D) Wenn C, woher bekomme ich die Infos, was die FPU alles kann? E) Welche Mathe Lib benutzt Paul, ausser https://github.com/PaulStoffregen/arm_math

Allgemein: Wenn ich mit den Datentypen flexibel bin, wie bekomme ich auf kurzem Wege raus, wie und wo bestimmte Berechnungen am schnellsten gehen (MCU/FPU/DSP), ohne ewig Benchmarks zu schreiben und das selbst auszutuefteln?

Gruesse,

Helmuth

Hallo,

Helmuth:
A) Wenn ich die CMSIS DSP Lib benutze, wird die DSP Hardware benutzt?

Ich denke der Compiler verwendet automatisch DSP-Befehle, wenn sich das ergibt.

Hier ein Beispiel aus einem älteren Softwarestand, den ich aber auf die Schnelle mit Google gefunden habe.
Quelle: https://developer.mbed.org/users/mbed_official/code/mbed-dsp/file/3762170b6d4d/cmsis_dsp/BasicMathFunctions/arm_abs_f32.c

void arm_abs_f32(
  float32_t * pSrc,
  float32_t * pDst,
  uint32_t blockSize)
{
  uint32_t blkCnt;                               /* loop counter */
 
#ifndef ARM_MATH_CM0_FAMILY
 
  /* Run the below code for Cortex-M4 and Cortex-M3 */                                 <-----------------
  float32_t in1, in2, in3, in4;                  /* temporary variables */
 
  /*loop Unrolling */
  blkCnt = blockSize >> 2u;
 
  /* First part of the processing with loop unrolling.  Compute 4 outputs at a time.    
   ** a second loop below computes the remaining 1 to 3 samples. */
  while(blkCnt > 0u)
  {


// ...


#else
 
  /* Run the below code for Cortex-M0 */                   <-----------------
 
  /* Initialize blkCnt with number of samples */
  blkCnt = blockSize;
 
#endif /*   #ifndef ARM_MATH_CM0_FAMILY   */
 
  while(blkCnt > 0u)
  {
    /* C = |A| */
    /* Calculate absolute and then store the results in the destination buffer. */
    *pDst++ = fabsf(*pSrc++);
 
    /* Decrement the loop counter */
    blkCnt--;
  }
}

Hier (Pfeile) sieht man am Beispiel der Implementierung der fabs Funktion für Arrays, wie das gemacht ist. Sobald der Code eine gewisse Struktur hat, kann der Optimierer des Compilers das erkennen und entsprechenden Code erzeugen.

Wann und was genau da erfüllt sein muss, da bin ich im Detail überfragt. Ist auch für unterschiedliche Compiler anders (g++, Keil, armcc, …)