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.

[参考译文] XTCIEVMK2LX:FFTLIB 的性能

Guru**** 2554470 points
Other Parts Discussed in Thread: FFTLIB

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/599682/xtcievmk2lx-performance-of-fftlib

器件型号:XTCIEVMK2LX

各位专家、您好。

如今、我正在测试 FFTLIB、并尝试使用1D SP FFT R2C 内核(FFT_sp_1D_r2c.c)在非常多的点数据20M 点进行 FFT。

我利用内核的示例项目 编写测试代码、并在直接模式下执行 FFT、因为在 EDMA 模式下输入大小受限。

创建 FFT 计划所需的时间太长、超过4秒、 执行计划所需的时间约为3.8秒。

这些时间是使用 TSCL/TSCH 测得的。 时间戳寄存器给出了使用的周期数、因此我通过除以时钟速度1GHz 来转换为以秒为单位的时间。

我发现、如果我使用大于20M、2^25的2个输入大小的幂、创建 FFT 计划所需的时间将小于20M 输入大小(~1)。 但是、执行时间相似(~3.8s)。

我想知道这是具有 C66 DSP 内核的 DSP 板的最佳性能吗? 当我在我的笔记本电脑上使用 Python 和 SciPy FFT 包进行 FFT 时、只需不到10us 的时间。 我的笔记本电脑具有2.53GHz CPU、我知道它比时钟速度为1GHz 的 DSP 快得多、但考虑到 DSP 芯片专门用于信号处理、这一差距太大了。 我想、如果我利用电路板上的所有4个 DSP 内核、速度会更快、但由于并行处理的限制、速度不会快4倍。 即使速度可以快4倍、但速度仍然不够快、无法满足我的需求(总折叠时间必须小于1秒)。

我缺少什么吗? 可以快得多吗? 以下是测试程序的代码片段:

(笑声)

#pragma DATA_SECTION (x_I、".DDR_mem");
#pragma DATA_SECTION (y_I、".DDR_mem");
#pragma DATA_SECTION (w_I、 ".DDR_mem");

#pragma DATA_ALIGN (x_I、8);
#pragma DATA_ALIGN (w_I、8);
#pragma DATA_ALIGN (y_I、8);

#define MAXN (2048*2048*8)
#define M (2个 MAXN)
#define PAD (0)
#define TEST_SIZE(2048*2048*8)

float x_I [M + 2 * pad];
float y_I [M + 2 * pad];
float w_I [4*2048+2 * pad];

...

float const clock_speed = 1e9;

int main ()
{
内部 J、N = TEST_SIZE;
Clock_t t_start、t_stop、t_开销、t_opt、t_mset_x、 t_mset_y、t_fill_x、t_cplan、t_tplan;
float t_opt_s、t_total_s;
FFT_PLAN p;
FFT_Callout_t PLAN_Fxns;

TSCL=0;TSCH=0;

PLAN_Fxns.memoryRequest = FFT_MEMORY_REQUEST;
PLAN_Fxns.memoryRelease = FFT_MEMORY_RELEASE;

T_start =_itoll (TSCH、TSCL);
memset (x_I、0x55、sizeof (x_I));
T_stop =_itoll (TSCH、TSCL);
T_mset_x = t_stop - t_start;

T_start =_itoll (TSCH、TSCL);
memset (y_i、0xA5、sizeof (y_i));
T_stop =_itoll (TSCH、TSCL);
T_mset_y = t_stop - t_start;

T_start =_itoll (TSCH、TSCL);
对于(j = 0;j < N;j++){
x_i[PAD + j]= cos (2 * 3.1415 * 50 * j /(双精度) N);
}
T_stop =_itoll (TSCH、TSCL);
T_fill_x = t_stop - t_start;

T_start =_itoll (TSCH、TSCL);
T_stop =_itoll (TSCH、TSCL);
T_开销= t_stop - t_start;

PLAN_Fxns.ecpyRequest =空;
PLAN_Fxns.ecpyRelease =空;

T_start =_itoll (TSCH、TSCL);
p = FFT_sp_plan_1D_r2c (N、FFT_Direct、PLAN Fxns);
T_stop =_itoll (TSCH、TSCL);
t_cplan = t_stop - t_start;

T_start =_itoll (TSCH、TSCL);
FFT_EXECUTE (p);
T_stop =_itoll (TSCH、TSCL);
T_opt =(t_stop - t_start)- t_开销;
T_opt_s = t_opt / clock_speed;

T_start =_itoll (TSCH、TSCL);
FFT_SAFE_PLAN (p);
T_stop =_itoll (TSCH、TSCL);
t_tplan = t_stop - t_start;

printf ("FFT_sp_1d_r2c_direct\tsize=%d\n"、N);
printf ("\ntn =%d\tCycle:%u (%.2fs)\n"、N、t_opt、t_opt_s);
printf ("\tt_mset_x:%u (%.2fs)\n"、t_mset_x、t_mset_x / clock_speed);
printf ("\tt_mset_y:%u (%.2fs)\n"、t_mset_y、t_mset_y / clock_speed);
printf ("\tt_fill:%u (%.2fs)\n"、t_fill x、t_fill x / clock_speed);
printf ("\tt_cplan:%u (%.2fs)\n"、t_cplan、t_cplan / clock_speed);
printf ("\tt_tplan:%u (%.2fs)\n"、t_tplan、t_tplan / clock_speed);

T_total_s = t_opt / clock_speed
+ t_mset_x / clock_speed
+ t_mset_y / clock_speed
+ t_fill_x / clock_speed
+ t_cplan / clock_speed
+ t_tplan / clock_speed;

printf ("\tTotal:%FS\n"t_total_s);
}

... 

输出如下。

-具有20M 点输入:

 FFT_sp_1d_r2c_direct size= 20000000
 N = 20000000周期:3755507597 (3.76s)
 T_mset_x:43494258 (0.04s)
 T_mset_y:43432856 (0.04s)
 T_fill_x:2978519097 (2.98秒)
 t_cplan:4229220388 (4.23秒)
 t_tplan:288 (0.00s)
 总计:11.050175s

-带2^25点输入:

 FFT_sp_1d_r2c_direct size= 33554432
 N = 33554432周期:3711867346 (3.71秒)
 T_mset_x:42884486 (0.04s)
 T_mset_y:42929794 (0.04s)
 T_fill_x:1658446567 (1.66s)
 t_cplan:857928992 (0.86s)
 t_tplan:288 (0.00s)
 总计:6.314057秒

谢谢!

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

    我已将此内容转发给 FFTLIB 专家。 他们的反馈应发布在此处。

    BR
    Tsvetolin Shulev