This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] PROCESSOR-SDK-AM62X:AM62x 上的 FFT 执行时间意外高–是否已启用 FPU?

Guru**** 2337880 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1506185/processor-sdk-am62x-unexpectedly-high-fft-execution-time-on-am62x-is-fpu-enabled

器件型号:PROCESSOR-SDK-AM62X

工具/软件:

尊敬的 TI 团队:

根据 TI 工程师的建议、我从上一篇文章(链接如下)中移除了与 FFT 相关的器件、以专注于讨论:

Point right https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1504886/processor-sdk-am62x-gpio-toggling-delay-inaccuracy-on-am62x-m4f-core/5785320#5785320  

现在、我将创建这篇单独的文章、专门询问我在 FFT 处理性能方面遇到的问题。

我将使用 AM62x 平台并对128个实数双精度值执行 FFT 计算。 我使用的函数是fft_calculation_128(x, mag, phase, 3)、我用测量执行时间ClockP_getTimeUsec()。 输出始终保持不变 25ms 、看起来异常高:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "ti_drivers_config.h"
#include "ti_drivers_open_close.h"
#include "ti_board_open_close.h"
包含"ti_DPL_config.h"
#include "/ADE9000/ADE9000RegMap.h"
#include "/ADE9000/ADE9000.h"
#include "s_cloud.h" Pripherals_Config
#include
#include "Calibration.h"
#include "(包含/FFT/fft_opt.h)"


ClockP_Params clockParams;

ClockP_Object clockObj;


void CS_GPIO_Init()

M4F_GPIO->DIR &=~(0x2000);
}

void Clock_Init ()

ClockP_Params_init (&clockParams);

clockParams.timeout = ClockP_instancy ToTicks (1);

clockParams.period = clockParams.timeout;

clockParams.start = 1;
}


const double sine_half_cycle_lut[128]={
0.000000、0.024541、0.049068、0.073565、0.098017、 0.122411、0.146730、0.170962、
0.195090、0.219101、0.242980、0.266713、0.290285、 0.313682、0.336890、0.359895、
0.382683、0.405241、0.427555、0.449611、0.471397 0.492898、0.514103、0.534998、
0.555570、0.575808、0.595699、0.615232、0.634393、 0.653173、0.671559、0.689541、
0.707107、0.724247、0.740951、0.757209、0.773010、 0.788346、0.803208、0.817585、
0.831470、0.844854、0.857729、0.870087、0.881921、 0.893224、0.903989、0.914210
0.923880、0.932993、0.941544、0.949528、0.956940、 0.963776、0.970031、0.975702、
0.980785、0.985278、0.989177、0.992480、0.995185、 0.997290、0.998795、0.999699、
1.000000、0.999699、0.998795、0.997290、0.995185、 0.992480、0.989177、0.985278、
0.980785、0.975702、0.970031、0.963776、0.956940、 0.949528、0.941544、0.932993、
0.923880、0.914210、0.903989、0.893224、0.881921、 0.870087、0.857729、0.844854、
0.831470、0.817585、0.803208、0.788346、0.773010、 0.757209、0.740951、0.724247、
0.707107、0.689541、0.671559、0.653173、0.634393、 0.615232、0.595699、0.575808、
0.555570、0.534998、0.514103、0.492898、0.471397 0.449611、0.427555、0.405241、
0.382683、0.359895、0.336890、0.313682、0.290285、 0.266713、0.242980、0.219101、
0.195090、0.170962、0.146730、0.122411、0.098017、 0.073565、0.049068、0.024541
};

void hello_world_main (void * args)

双重测试= 1.0;

const uint8_t hamonics = 3;

双精度 x[256];
双 MAG[hamonics];
双相[hamonics];

/*打开驱动程序以打开控制台的 UART 驱动程序*/
drivers_open();
BOARD_DRIVERSOpen ();

Clock_Init ();

CS_GPIO_Init();

Timer_Init ();

对于(uint16_t i =0;i < 128;i++)

x[i * 2]= sine_half_cycle_lut[i];
X[i * 2 + 1]= 0.0;
}

DebugP_log ("test is %f\r\n"、test);

Uint16_t strTime = ClockP_getTimeUssec ();

fft_calculation_128 (x、MAG、PHASE、3);

Uint16_t EndTime = ClockP_getTimeUssec ();

对于(uint8_t i = 0;i < 128;i ++)

DebugP_log ("FFT amount of x[%d] is %f +%f j\r\n"、i、x[i * 2]、x[i*2 + 1]);

ClockP_USleep (100);
}

DebugP_log ("FFT 计算花费的时间为%d us\r\n"、EndTime - strTime);


while (1)

}

Board_driversClose();
drivers_close();
}


x[0]的 FFT 量为81.483242 + 0.000000 j
x[1]的 FFT 量为-27.166536 + 0.000000 j
x[2]的 FFT 量为-5.436583 + 0.000000 j
x[3]的 FFT 量为-2.332302 + 0.000000 j
FFT 数量 x[4]为-1.297546 + 0.000000 j
FFT 数量 x[5]为-0.827208 + 0.000000 j





FFT 计算所需的时间为25271us

这种高延迟会导致应用中的实时处理出现问题。

我想问:

  • 此性能问题是否与系统时钟配置或未正确设置 CPU 频率有关?

  • AM62x 上是否默认启用 FPU (浮点单元)? 如果没有、如何在我的环境中正确确认和启用它?

感谢您提供有关改进该平台上 FFT 性能的任何指导。

此致、
Soheil



  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Soheil:

    您正在从哪个内核进行上述 FFT 计算?

    此外、内核以什么频率运行?

    此致、

    Tushar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Tushar:

    感谢您的支持。
    我将从运行 FFT 计算 M4F 内核 外部电阻器。

    我在测试过程中观察到 M4F 内核需要相关资源 10个周期 只需对两个浮点数进行简单的乘法。 对于此类基本操作、这似乎非常慢、我认为我的 FFT 代码需要很长时间的原因之一与此相关。

    下面是我使用的小型测试代码:

    M4F_GPIO->DIR &=~(0x2000);

    悬空 val_1 = 5.55556;
    浮点  val_2 = 6.35978;
    浮点  val_3 = 0.0;

    while (1)

    M4F_GPIO->SET_DATA = 0x2000;

    //我重复这一行100次
    Val_3 = val_1 * val_2;


    M4F_GPIO->CLR_DATA = 0x2000;
    //我重复这一行100次
    Val_3 = val_1 * val_2;




    }

    有没有办法 减少周期数 需要这些浮点运算?
    还是这种缓慢的行为 导致一定的延迟 (例如内部/外部存储器)?
    另外、请您确认是否存在 FPU (浮点单元) 在 M4F 内核上默认启用吗?

    再次感谢您的帮助!

    此致、
    Soheil

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Soheil:

    请留出一些时间来检查上述内容并返回。

    此致、

    Tushar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Soheil:

    感谢您的耐心。

    您能否检查一下执行上述乘法所需的汇编指令数量?

    对我来说、它只需要4条汇编指令。 请参阅下图。

    此致、

    Tushar