器件型号: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秒
谢谢!